Java JTable 与 JComboBox

2024-03-25

我试图将 JComboBox 放置在 JTable 的特定列中。 我有这段代码,并且它正在工作:

    model = new DefaultTableModel();
    JComboBox<String> optionComboCell = new JComboBox<String>();
    optionComboCell.addItem("Option 1");
    optionComboCell.addItem("Option 2");
    optionComboCell.setSelectedIndex(1);


    table = new JTable(model);
    // Adding here all the columns, removed for clarity
    model.addColumn("Options");
    TableColumn optionsColumn = table.getColumn("Options");
    optionsColumn.setCellEditor(new DefaultCellEditor(optionComboCell));

我的问题是,在选择该列中的单元格之前,它不会显示为 JComboBox。 加载 JFrame 后,整个表格看起来相同,就好像所有单元格都只有文本一样。 单击时,它会显示组合框的箭头和选项,但再次取消选择时,它看起来像常规单元格。

有办法解决这个问题吗?


是的,使用 JComboBox 来渲染单元格:

import java.awt.Component;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class Test4 {

    private static class ComboBoxCellRenderer extends JComboBox implements TableCellRenderer {

        public ComboBoxCellRenderer(int column) {
            for (int i = 0; i < 10; i++) {
                addItem("Cell (" + i + "," + column + ")");
            }
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setSelectedItem(value);
            return this;
        }
    }

    protected void initUI() {
        JFrame frame = new JFrame("test");
        frame.add(getTable());
        frame.pack();
        frame.setVisible(true);
    }

    private Component getTable() {
        Vector<Vector<String>> data = new Vector<Vector<String>>();
        for (int i = 0; i < 10; i++) {
            Vector<String> row = new Vector<String>();
            for (int j = 0; j < 3; j++) {
                row.add("Cell (" + i + "," + j + ")");
            }
            data.add(row);
        }
        Vector<String> columns = new Vector<String>();
        columns.add("Column 1");
        columns.add("Column 2");
        columns.add("Column 3");
        DefaultTableModel model = new DefaultTableModel(data, columns);
        JTable table = new JTable(model);
        table.setRowHeight(20);
        int i = 0;
        Enumeration<TableColumn> c = table.getColumnModel().getColumns();
        while (c.hasMoreElements()) {
            TableColumn column = c.nextElement();
            column.setCellRenderer(new ComboBoxCellRenderer(i));
            i++;
        }
        JScrollPane scroll = new JScrollPane(table);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        return scroll;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test4().initUI();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java JTable 与 JComboBox 的相关文章

随机推荐

  • 使用 Apache CXF 和 CDI 的 Spring Boot

    使用时Apache 的 CXF JAX RS Spring Boot 启动器 http cxf apache org docs springboot html SpringBoot SpringBootCXFJAX RSStarter与CX
  • 将现有 WAR 部署到嵌入式 Jetty

    我的目的是将现有的 WAR 部署到嵌入式 Jetty 9 4 5 不幸的是 当我尝试打开页面 JSP 时出现以下错误 An error occurred at line 52 in the generated java file tmp e
  • Oracle SQL中如何获取与正则表达式匹配的字符串的一部分

    假设我在表的某些字段中有以下字符串 product 1627 color 45 size 7 我想查询颜色并得到 45 通过这个查询 SELECT REGEXP SUBSTR product 1627 color 45 size 7 col
  • 如何在设备树源文件中添加注释

    如何在设备树源文件中添加多行或单行注释 我到处都找不到它 使用注释的默认 c 方式是否有效 使用注释的默认 c 方式是否有效 是的 使用 comment ADDENDUM 我还使用过 C 预处理器 if 0 and endif在测试期间快速
  • 如何在使用inputView后显示键盘

    I used inputView以显示uipickerview for my textfield 但我用同样的textfield用于其他功能 使用后如何显示标准键盘inputView为了那个原因textfield textfield inp
  • Android 中的底部按钮栏

    我想知道如何在 android 中创建底部栏按钮 我读到了一些关于这个 U I 的内容 解决办法 有什么控件可以使用吗 您可以在相对布局中执行类似的操作
  • 我正在尝试解决“15 个难题”,但出现“OutOfMemoryError”[已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有没有一种方法可以优化此代码以免耗尽
  • 使用分页 extjs 在组合框中搜索

    您好 我正在尝试在组合框中进行搜索 它正在工作 但仅在当前页面中搜索我也使用分页搜索 我需要在所有页面中搜索而不仅仅是当前页面 任何建议 xtype combo fieldLabel Organization Id name company
  • 将 Streaming Flux 的 WebClient Post 拆分为 JSON 数组

    我正在使用第三方 REST 控制器 它接受 JSON 对象数组并返回单个对象响应 当我使用有限的 WebClient 进行 POST 时Flux代码有效 我认为 因为Flux完成 然而 当Flux可能是无限的 我该怎么办 以数组块形式发布
  • 如何在CSS多列布局中将单列居中

    我有一个使用 CSS 多列布局的元素来显示项目列表 div style text align center div Item 1 div div Item 2 div div Item 3 div div Item 4 div div It
  • 在 C# 中从未知长度的流计算哈希值

    C 中计算未知长度流的 动态 md5 之类哈希的最佳解决方案是什么 具体来说 我想根据通过网络接收的数据计算哈希值 我知道当发送者终止连接时我已经完成接收数据 所以我事先不知道长度 编辑 现在我正在使用 md5 并在保存数据并将其写入磁盘后
  • GitHub 页面上的 AngularJS html5mode 支持

    问题是 does GitHub 页面支持AngularJShtml5mode 我找到了一个www资源 https coderwall com p kfomwa angularjs html5mode on github pages其中指出可
  • 线程不活动时释放资源

    我正在使用BackgroundWorker 在其中我使用foreach循环 在其中创建新线程 等待它完成 然后报告进度并继续foreach循环 这就是我要说的 private void DoWork object sender DoWork
  • springfox-swagger2 UI是否支持一次选择多个文件?

    我使用 Spring Boot 和集成的 swagger ui springfox swagger2 我希望能够选择一次上传多个文件 不幸的是 Swagger UI 似乎不允许这样做 至少不允许我的控制器方法 我的控制器方法签名 ApiOp
  • 过滤包含特定字符串的数据[重复]

    这个问题在这里已经有答案了 我希望过滤包含特定字符串的数据 假设这是我的数据集 dst first second 24 Sienna Zoe Dylan 32 Amber John Noah Sienna 72 Daniel Mike Zo
  • React 代码抛出“TypeError:this.props.data.map 不是函数”

    我刚刚开始用 React 编码 我习惯用 CoffeeScript 编码 我尝试沿着React 文档中提供的教程 http facebook github io react docs tutorial html并为状态更新做了类似的事情 然
  • 如何从 Google Places API 获取 20+ 结果?

    我正在开发一个应用程序 在其中我可以获取用户附近的 ATM 列表 为此 我使用 Google Places API 但每次它只返回 20 个结果 我想获得更多结果 在 API 文档中提到它将返回 20 个结果 但我想知道有什么方法可以获得更
  • Html 渲染不正确,并且没有使用 Ajax.ActionLinks 设置 Viewbag.Title

    ViewStart cshtml Layout Request IsAjaxRequest null Views Shared Layout cshtml 布局 cshtml div AjaxOptions options new Ajax
  • Android 3.0 使用物理键盘设置

    背景 我最近购买了一台摩托罗拉 XOOM 平板电脑以及桌面扩展坞和蓝牙键盘配件 扩展坞和键盘工作得很好 但是当我将平板电脑从扩展坞上取下并远离办公桌时 键盘仍然与设备配对 我必须手动更改设置才能使用软键盘 当我将其放回坞站时也是如此 我需要
  • Java JTable 与 JComboBox

    我试图将 JComboBox 放置在 JTable 的特定列中 我有这段代码 并且它正在工作 model new DefaultTableModel JComboBox