当前位置: 首页 > 知识库问答 >
问题:

带有JComboBox的Java JTable

司易安
2023-03-14

我试图在JTable的某个列中放置一个JComboBox。我有这个代码,它正在工作:

    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时,整个表看起来都一样,好像所有单元格中只有文本。单击时,它会显示组合框的箭头和选项,但再次取消选择时,它看起来像一个常规单元格。

有办法绕过它吗?

共有3个答案

娄阳舒
2023-03-14

同时尝试设置单元渲染器。

窦凯定
2023-03-14

您需要定义自己的渲染器,以便在表格上显示组件,因为CellEditor仅用于编辑tablecell中的值(这就是为什么它仅在单击单元格时才会做出反应)。

也许看看Java教程,了解更多关于JTables渲染器和编辑器的概念。

龙承德
2023-03-14

是的,使用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();
            }
        });
    }
}
 类似资料:
  • 所以我需要的功能是组合框,在扩展时可以右键单击,然后弹出菜单显示不同的操作。 为此,我使用以下构造函数扩展了JCombobox: 创建了HistoryComboPopup类,它扩展了BasicComboPopup,并有一个鼠标侦听器 弹出窗口工作,我可以处理它的菜单点击。唯一的麻烦是当我打开JPopupMenu时,组合框关闭,我点击右键的项目不再出现。 我目前不知道该怎么办,所以任何帮助都将不胜感

  • 问题内容: 是否可以在JComboBox中定义与实际内容不同的值? 在HTML中,其外观如下: 无论内容多长时间,都可以在此处获得一个短值。 在Java中,我只知道以下解决方案: 但是在这里,我只会得到“ Cat”,“ Dog”等信息 。问题是,我要将客户的所有名称从数据库加载到JComboBox中,然后从所选客户中检索ID。它看起来应该像这样: 问题答案: 如果创建Customer类并将Cust

  • 介绍 (Introduction) JComboBox类是一个组合按钮或可编辑字段和下拉列表的组件。 Class 声明 (Class Declaration) 以下是javax.swing.JComboBox类的声明 - public class JComboBox extends JComponent implements ItemSelectable, ListDataLis

  • 我有一个在运行时加载行的表。加载后,用户需要在每一行的第一列中从中选择一个项目。然后他需要在每行的同一行上从另一个中选择一个项目。第二个的内容取决于第一个的选择。 我现在的编码方式是更改整个第二列的combobox内容。 有没有一种方法可以让每一行的组合框对象都不一样,这样我就可以在第一个组合框中选择一个值的时候处理它?

  • 问题内容: 我正在尝试结合2个jcombobox。1个组合框用于显示费用类别。第二个组合框正在从文本文件读取文件以显示产品类型。如果我更改第一个组合框,我希望第二个组合框将根据用户在第一个组合框中的选择进行更改。 我是否仍有可能从文本文件加载其他组合框?该子项将不是Arrays,而是与以前相同,因为它位于cboperson代码的底部。 编辑的代码: 问题答案: 例如

  • 我创建了包含员工信息的。在这个JTable中,我添加了名为“资历”的列。此列由表示(每行的内容不同)。例如: 内容取自。 问题是在第1行和第2行中选择的项目是“程序员”,但是“程序员”不应该出现在第2行中。只有当我单击时,才会出现正确的列表,即第2行-{“writer”,“editor”}。