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

JTable更改列顺序再编辑单元格引发错误

微生季
2023-03-14
  1. 我拥有的东西

两列JTable。第二列使用JComboBox作为单元格编辑器。

当我用origin列顺序编辑JComboBox单元格时,它工作得很好。但当我首先更改列时,比如切换2列(JComboBox列成为拳头),然后我编辑了JComboBox单元格引发bug。我必须单击该单元格两次才能触发编辑事件,否则,JComboBox将不被激活。

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.AbstractAction;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;

import java.awt.GridLayout;
import javax.swing.JTable;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JScrollPane;

public class MainTable extends JDialog {
    private static final long serialVersionUID = 156332386872772726L;

    private final JPanel contentPanel = new JPanel();
    private DefaultTableModel tableModel;
    private JTable table;

    public static void main(String[] args) {
        try {
            MainTable dialog = new MainTable();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public MainTable() {
        setBounds(100, 100, 450, 300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        contentPanel.setLayout(new GridLayout(1, 0, 0, 0));
        {
            JScrollPane scrollPane = new JScrollPane();
            contentPanel.add(scrollPane);
            {
                table = new JTable();
                table.setAutoCreateRowSorter(true);
                tableModel = new DefaultTableModel(new String[]{"first","second"},0);

                table.setModel(tableModel);
                {
                    //set comboBox to table
                    JComboBox<String> comboBox = new JComboBox<String>();
                    comboBox.addItem("Input");
                    comboBox.addItem("Output");

                    table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(comboBox));
                    table.getColumnModel().addColumnModelListener(new TableColumnModelListener(){
                        @Override
                        public void columnAdded(TableColumnModelEvent arg0) {

                        }

                        @Override
                        public void columnMarginChanged(ChangeEvent arg0) {

                        }

                        @Override
                        public void columnMoved(TableColumnModelEvent arg0) {
                            table.requestFocusInWindow();
                            comboBox.setFocusable(true);
                            comboBox.requestFocus();
                            comboBox.grabFocus();
                            comboBox.requestFocusInWindow();//try to get focus, not worked.
                        }

                        @Override
                        public void columnRemoved(TableColumnModelEvent arg0) {

                        }

                        @Override
                        public void columnSelectionChanged(ListSelectionEvent arg0) {

                        }
                    });
                }
//              TableCellListener tcl = new TableCellListener(table, new AbstractAction(){
//                  @Override
//                  public void actionPerformed(ActionEvent e) {
//                  }
//              });
                tableModel.addRow(new Object[]{"1","Input"});
                tableModel.addRow(new Object[]{"2","Output"});//init. add 2 rows
                scrollPane.setViewportView(table);
            }
        }
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
            {
                JButton okButton = new JButton("Add");
                okButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent arg0) {
                        int row = tableModel.getRowCount();
                        tableModel.addRow(new Object[]{row,"Input"});//click button to add a row
                    }
                });
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
        }
    }

}

共有1个答案

微生景胜
2023-03-14

我必须单击该单元格两次才能触发编辑事件,否则,JComboBox将不被激活。

这只在更改列顺序后首次尝试编辑列时才会发生。如果将列切换回其原始位置,也会发生这种情况。

这就像是表没有焦点,所以第一次点击鼠标就给了表焦点。

 类似资料:
  • 我有一个JTable,它应该是2列(String,JComboBox)。当我初始化表时,一切看起来都很好。只要一个I在表中选择了一个值,JComboBox单元格就会获取所选项的数据类型。 我想保持JCOmboBox在那里,让它触发数据更改事件,表忽略该列中的数据更改,并保持ComboBox填充。 我的表将此作为覆盖

  • 我想要一个有4列的jtable。一列必须是组合框。其他列是字符串。 只要找到问题:在注释语句jcb.seteditable(true)时;,如果我在comboxcell上单击一次,它就会打开这个单元格。但我不知道为什么效果更好。此外,我希望combox可编辑。 我怎么能对其他细胞有同样的行为。 再次您好,我已经更新了代码,以便使-如果我通过重写方法在单元格上单击一次,单元格可以编辑-如果我通过重写

  • 我有一个jtable保存账本文件记录并将它们发送出去。

  • 问题内容: 我需要在jTable中显示数字,精确到小数点后两位。为此,我创建了一个自定义单元格编辑器,如下所示: 该单元格编辑器非常适合将点用作小数点的英语语言环境。但是在德语语言环境中,它不接受逗号作为小数点的值。请让我知道我的代码中有问题的地方。提前致谢。 编辑:这是我如何使其工作: 问题答案: 使用语言环境来发挥您的优势:

  • 问题内容: 我在TableView上有一个事件侦听器,用于侦听键盘事件。 当用户单击Enter或将焦点更改到另一个单元格时,使用新数据更新单元格时出现问题。当您单击输入或更改焦点时,该单元格将变为空。我不知道为什么。如何保存数据并使用新数据更新单元格。 问题答案: 这些变得非常棘手。我认为任何与“行为相关”的东西(即对用户输入做出反应的标准控件)都很难更改,并且JavaFX通常不提供很好的支持。希

  • 问题内容: 我想制作一个可编辑的表,然后检查数据以确保其有效。我不确定如何仅更改一个单元格的颜色。我想要一个单元格,例如(0,0)并将前景颜色设置为红色。我已经阅读了SO和Oracle上有关自定义ColorRenderer的其他文章,但是我不知道如何使用它。 谢谢。 问题答案: 假设您要用其他颜色渲染的单元格代表一种状态(我将以“拒绝并批准”为例)。然后,我将在我的表模型中实现一个名为getSta