【问题标题】:For one column of a JTable, how do I put a unique combo box editor in each row?对于 JTable 的一列,如何在每一行中放置一个唯一的组合框编辑器?
【发布时间】:2013-11-01 09:26:07
【问题描述】:

想法如下:假设我有一个扩展TableModel 的类,具有类似List<List<String>> collection 的字段。在一个事件中,我想清除 JTable 并重新添加一个特定列是组合框的行;组合框n 中的项目是我列表中collection.get(n)List<String> 中的项目。所以我正在迭代 collection 添加行,并且我正在迭代每个 collection.get(n) 添加组合框项目。

没有事件监听器。当点击一个单独的按钮时,只要我可以在每个组合框上getSelectedIndex,我就可以计算出需要发生的事情。

我花了两个半小时将我的 GUI 变成了代码意大利面条,在那里我几乎扩展了所有内容,并且几乎对所有内容都有最大的耦合。我想我什至可能有两个不相交的JComboBox 实例集合。我这样说是为了强调,发布我目前拥有的任何代码对我绝对没有好处。

我已经阅读了these 中的the oracle tutorial on JTableallstrangely 不要have 一个我能理解的解释。

所以基本上我只需要知道我需要什么,因为我没有找到任何资源。

【问题讨论】:

  • 首先,TableModel 用于对要查看的数据进行建模,因此不必担心尝试将组合框或组合值放入其中。相反,建立一个 TableCellEditor 并将 List> 传递给它。每当编辑单元格时,表格将需要编辑器组件,它将传递行和列索引。根据行所需的值简单地准备 ComboBoxModel,并将其播种到编辑器

标签: java swing jtable jcombobox tablecelleditor


【解决方案1】:

因此,基本上,您需要一个TableCelLEditor,它能够使用可用列表中的行播种JComboBox,例如...

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TableCellEditor {

    public static void main(String[] args) {
        new TableCellEditor();
    }

    public TableCellEditor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                List<List<String>> values = new ArrayList<>(25);
                for (int row = 0; row < 10; row++) {

                    List<String> rowValues = new ArrayList<>(25);
                    for (int index = 0; index < 10; index++) {
                        rowValues.add("Value " + index + " for row " + row);
                    }
                    values.add(rowValues);

                }

                DefaultTableModel model = new DefaultTableModel(new Object[]{"Data"}, 10);
                JTable table = new JTable(model);
                table.setShowGrid(true);
                table.setGridColor(Color.GRAY);
                table.getColumnModel().getColumn(0).setCellEditor(new MyEditor(values));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class MyEditor extends DefaultCellEditor {

        private List<List<String>> rowValues;

        public MyEditor(List<List<String>> rowValues) {
            super(new JComboBox());
            this.rowValues = rowValues;
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

            JComboBox cb = (JComboBox) getComponent();
            List<String> values = rowValues.get(row);
            DefaultComboBoxModel model = new DefaultComboBoxModel(values.toArray(new String[values.size()]));
            cb.setModel(model);

            return super.getTableCellEditorComponent(table, value, isSelected, row, column);

        }

    }

}

【讨论】:

  • 感谢您快速明确的回复!遗憾的是,我没有要投票的评价。我没有更多错误,删除了大约 80% 的相关代码,这些代码实际上并没有做任何事情,现在我又被困住了:该列只是显示每个列表的 toString,并没有t 响应鼠标。我不知道我是否需要做一些渲染或什么。
  • 看看How to use tables,寻找自定义渲染部分。表模型的 isCellEditable 可能返回 false,这意味着单元格不可编辑。如果您仍然有问题,最好的选择是发布另一个问题,说明您有什么
猜你喜欢
  • 2014-09-08
  • 2018-08-05
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多