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

JTable中JCombobox的setSelectedItem

贺景山
2023-03-14
JTable table = new JTable();
    Vector<ArrayList<Object>> data = new Vector<ArrayList<Object>>();
    for (int i = 0; i < 5; i++)
    {
        ArrayList<Object> object = new ArrayList<Object>();
        object.add(i);
        object.add("name");
        object.add(i+1);
        object.add(i+1);
        object.add(i+1);
        data.add(object);
    }
    DefaultTableModel tableModel = new DefaultTableModel() {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        public boolean isCellEditable(int row, int column) {
            if (column < 2)
                return false;
            return true;
        }
    };
    tableModel.setColumnIdentifiers(new String[] {"ID", "Name", "OK", "Other", "Error"});
    tableModel.addTableModelListener(new TableModelListener()
    {

        @Override
        public void tableChanged(TableModelEvent e)
        {
            if (e.getType() == TableModelEvent.UPDATE)
            {
                int row = e.getFirstRow();
                int column = e.getColumn();
                TableModel table_model = (TableModel) e.getSource();
                ArrayList<Object> changed_data = (ArrayList<Object>) table_model.getValueAt(row, column);
                String row_id = String.valueOf(table_model.getValueAt(row, 0));
                for (ArrayList<Object> list : data)
                {
                    String compare_id = String.valueOf(list.get(0));
                    if (row_id.equals(compare_id))
                    {
                        list.set(column, String.valueOf(changed_data.get(0)));
                        for (int i = table_model.getRowCount()-1; i >= 0 ; i--)
                        {
                            tableModel.removeRow(i);
                        }

                        for (ArrayList<Object> object : data)
                        {
                            Vector<String> vector = new Vector<String>();
                            vector.addElement(String.valueOf(object.get(0)));
                            vector.addElement(String.valueOf(object.get(1)));
                            vector.addElement(String.valueOf(object.get(2)));
                            vector.addElement(String.valueOf(object.get(3)));
                            vector.addElement(String.valueOf(object.get(4)));
                            tableModel.addRow(vector);
                        }

                        TableColumn column_ok = table.getColumnModel().getColumn(2);
                        TableColumn column_other = table.getColumnModel().getColumn(3);
                        TableColumn column_error = table.getColumnModel().getColumn(4);

                        JComboBox<ArrayList<Object>> combobox_ok = new JComboBox<ArrayList<Object>>(data);
                        JComboBox<ArrayList<Object>> combobox_other = new JComboBox<ArrayList<Object>>(data);
                        JComboBox<ArrayList<Object>> combobox_error = new JComboBox<ArrayList<Object>>(data);

                        column_ok.setCellEditor(new DefaultCellEditor(combobox_ok));
                        column_other.setCellEditor(new DefaultCellEditor(combobox_other));
                        column_error.setCellEditor(new DefaultCellEditor(combobox_error));
                        break;
                    }
                }
            }
        }
    });
    table.setModel(tableModel);
    for (ArrayList<Object> object : data)
    {
        Vector<String> vector = new Vector<String>();
        vector.addElement(String.valueOf(object.get(0)));
        vector.addElement(String.valueOf(object.get(1)));
        vector.addElement(String.valueOf(object.get(2)));
        vector.addElement(String.valueOf(object.get(3)));
        vector.addElement(String.valueOf(object.get(4)));
        tableModel.addRow(vector);
    }

    TableColumn column_ok = table.getColumnModel().getColumn(2);
    TableColumn column_other = table.getColumnModel().getColumn(3);
    TableColumn column_error = table.getColumnModel().getColumn(4);

    JComboBox<ArrayList<Object>> combobox_ok = new JComboBox<ArrayList<Object>>(data);
    JComboBox<ArrayList<Object>> combobox_other = new JComboBox<ArrayList<Object>>(data);
    JComboBox<ArrayList<Object>> combobox_error = new JComboBox<ArrayList<Object>>(data);

    column_ok.setCellEditor(new DefaultCellEditor(combobox_ok));
    column_other.setCellEditor(new DefaultCellEditor(combobox_other));
    column_error.setCellEditor(new DefaultCellEditor(combobox_error));

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.getViewport().add(table);

    JFrame frame = new JFrame();
    frame.add(scrollPane);
    frame.setSize(400, 200);
    frame.setVisible(true);

现在,在第一行第三列(“OK”)中,您可以在JComboBox中选择表示一行的不同条目。因此一行有三个引用另一行的JComboBoxes。如果您在这样的JComboBox中单击,您会注意到它总是选择第一个条目,而不是您在单击之前看到的带有数字的条目。

也许现在你明白我想做什么了?

共有1个答案

田意致
2023-03-14

如果您在这样的JComboBox中单击,您会注意到它总是选择第一个条目,而不是您在单击之前看到的带有数字的条目。

关注问题的这一方面,以下简化的完整示例总是在单元格的编辑器处于活动状态时显示选定的条目。您可以根据需要替换组合的默认呈现器以显示不同的结果。此外,

>

  • 重写GetPreferredScrollableViewportSize()以建立表的所需大小。

    尽可能使用类型参数;例如,根据需要重写getColumnClass()

    重写从属数据的getValueat(),如下所示。

    请注意下面iscelleditable()的简化实现。

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.util.Arrays;
    import java.util.Vector;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    
    /**
     * @see https://stackoverflow.com/q/39993746/230513
     */
    public class TableComboTest {
    
        private Vector<Vector<String>> createData() {
            Vector<Vector<String>> data = new Vector<Vector<String>>();
            for (int i = 0; i < 5; i++) {
                Vector<String> rowVector = new Vector<String>();
                rowVector.add(String.valueOf(i));
                rowVector.add("name");
                rowVector.add(String.valueOf(i + 1));
                rowVector.add(String.valueOf(i + 1));
                rowVector.add(String.valueOf(i + 1));
                data.add(rowVector);
            }
            return data;
        }
    
        private void display() {
            Vector<Vector<String>> data = createData();
            Vector<String> names = new Vector<>(Arrays.asList("ID", "Name", "OK", "Other", "Error"));
            DefaultTableModel tableModel = new DefaultTableModel(data, names) {
    
                @Override
                public boolean isCellEditable(int row, int column) {
                    return column > 1;
                }
            };
            JTable table = new JTable(tableModel) {
                @Override
                public Dimension getPreferredScrollableViewportSize() {
                    return new Dimension(getPreferredSize().width, getRowHeight() * 4);
                }
            };
    
            TableColumn column_ok = table.getColumnModel().getColumn(2);
            TableColumn column_other = table.getColumnModel().getColumn(3);
            TableColumn column_error = table.getColumnModel().getColumn(4);
    
            String[] choices = new String[]{"1", "2", "3", "4", "5"};
            JComboBox<String> combobox_ok = new JComboBox<>(choices);
            JComboBox<String> combobox_other = new JComboBox<String>(choices);
            JComboBox<String> combobox_error = new JComboBox<String>(choices);
    
            column_ok.setCellEditor(new DefaultCellEditor(combobox_ok));
            column_other.setCellEditor(new DefaultCellEditor(combobox_other));
            column_error.setCellEditor(new DefaultCellEditor(combobox_error));
    
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new JScrollPane(table));
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new TableComboTest()::display);
        }
    }
    

  •  类似资料:
    • 我创建了一个表单,其中添加了一个,它有3列。第二列和第三列有编辑器。 我希望当我们选择第二列组合框的第一项时,第三列组合框的第一个组合框也应该被选择,反之亦然。 我该怎么做?

    • 好吧,这很难解释,但我会尽力的。 我在JTable中有一个JTextField和一个JComboBox,它的getCellEditor方法被覆盖如下: 以下是行为差异(请注意,从现在开始,当我说JTextField或JComboBox时,我指的是JTable中包含任一组件的单元格): > 当我使用tab键或箭头键导航到JTextField,然后开始键入时,我键入的字符会自动输入单元格。然而,当我以

    • 我有一个JTable对象,我会在一个列上添加5个不同的JComboBox。 我已经尽力了: 但这会将相同的JComboBox添加到该列的所有单元格中。如何在同一列中添加不同的内容? 非常感谢。

    • 我试图在JTable的某个列中放置一个JComboBox。我有这个代码,它正在工作: 我的问题是,在选中该列中的一个单元格之前,它不会显示为JComboBox。加载JFrame时,整个表看起来都一样,好像所有单元格中只有文本。单击时,它会显示组合框的箭头和选项,但再次取消选择时,它看起来像一个常规单元格。 有办法绕过它吗?

    • 问题内容: 我不知道如何在特定行中设置一个jcombobox …现在我已经为所有行设置了这个jcombobox,但是我只希望在一行中设置它: 问题答案: 更新: 在测试我的(可能是不完整的)答案时,我遇到了一个非常好的SO问题,我认为它将比我能提供的更好:将JComboBox放入JTable 另一个更新: 我再次阅读了您的问题,并且意识到您要求输入 特定的行 。我能想到的唯一方法是创建一个自定义C