java - JTable 的 JComboBox 单元格编辑器在打开列表时已经设置了值,即使在组合框外单击也是如此

标签 java swing jtable

JTableJComboBox 单元格编辑器在打开列表时已经设置了值,即使在组合框外单击也是如此。此外,一旦选择了某个值,下次打开选择时,该值将成为默认值:

enter image description here

代码如下:

public class Main {
    public static void main(String[] args) {
        new QuestionFrame();
    }
}

问题框架:

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;

class QuestionFrame extends JFrame {
    QuestionFrame(){
        class Model {
            int num;
            private Model(int n) { num = n; }
        }
        final Model[] model = {new Model(9), new Model(8), new Model(7)};

        JPanel panel = new JPanel(new BorderLayout());
        JTable table = new JTable(new AbstractTableModel(){
            @Override public int getRowCount() { return model.length; }
            @Override public int getColumnCount() { return 1; }
            @Override public Object getValueAt(int rowIndex, int columnIndex) {
                return model[rowIndex].num;
            }
            @Override public String getColumnName(int column){ return "NUM"; }
            @Override public Class<?> getColumnClass(int columnIndex) { return Integer.class; }
            @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; }
            @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                model[rowIndex].num = (int) aValue;
            }
        });
        DefaultCellEditor cellEditor = new DefaultCellEditor(new JComboBox<>(new Integer[]{1,2,3}));
        cellEditor.setClickCountToStart(1);
        table.getColumnModel().getColumn(0).setCellEditor(cellEditor);
        panel.add(new JScrollPane(table), BorderLayout.CENTER);

        setBounds(new Rectangle(500,250,200,200));
        add(panel);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

这是有道理的,因为 setCellEditor(cellEditor) 重用了相同的 JComboBox 对象实例,但我找不到另一种方法来做到这一点..

那么怎么解决呢?

最佳答案

您的问题是因为当前单元格值不是组合框编辑器的可能选择之一,因此组合默认为第一个选择。如果您更改编辑器以包含当前值,例如

DefaultCellEditor cellEditor = new DefaultCellEditor(
        new JComboBox<>(new Integer[] { 1, 2,3, 4, 5, 6, 7, 8, 9 }));

然后它就正常工作了,正如预期的那样。

如果您想要对编辑器进行更细粒度的控制,那么您需要自己动手而不是使用默认的。

关于java - JTable 的 JComboBox 单元格编辑器在打开列表时已经设置了值,即使在组合框外单击也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41250620/

相关文章:

java - 如何处理这个InputMismatchException?

java - JavaFx 2.0 在 Web 应用程序客户端的可移植性如何(以及是否高效)?

java - 保持图形屏幕

java - 向 JTable 添加彩色行

java - 如何避免本地声明隐藏更高级别的声明

没有硬编码大小的 Java 数组声明

java swing 实时使用 revalidate 和 repaint

java - 如何让我的小程序将用户的输入转换为整数并将其与计算机的随机数进行比较?

java - 如何在Java swing中查看数据库结果集

java - 如何动态设置jtable内的jcheckbox