Java 为什么设置JTable header列?

Java 为什么设置JTable header列?,java,swing,jtable,jpopupmenu,jtableheader,Java,Swing,Jtable,Jpopupmenu,Jtableheader,在JPanel表单中有一个JTable。由于某些原因,在对表单执行某些操作后,在第二次(以及所有后续时间)打开表单时,我开始收到以下错误: Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 at java.util.Vector.elementData(Vector.java:737) at java.util.Vector.elementAt(Vector.java:480)

在JPanel表单中有一个JTable。由于某些原因,在对表单执行某些操作后,在第二次(以及所有后续时间)打开表单时,我开始收到以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementData(Vector.java:737)
at java.util.Vector.elementAt(Vector.java:480)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)
at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderRenderer(BasicTableHeaderUI.java:693)
at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderUI.java:709)
at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:685)
at javax.swing.plaf.synth.SynthTableHeaderUI.paint(SynthTableHeaderUI.java:173)
at javax.swing.plaf.synth.SynthTableHeaderUI.update(SynthTableHeaderUI.java:144)
at javax.swing.JComponent.paintComponent(JComponent.java:780)...
经过一些调查,我发现,一个标题弹出菜单导致了这种情况,只需调用弹出菜单,然后关闭表单,打开表单并接收错误

经过进一步调查后,找到了一个解决方法:在设置表单可见之前执行以下命令,错误消失:

header.setDraggedColumn(null);
所以它是obviuos,在第二次打开表单之前,由于某种原因将标题的列设置为拖动。应用程序中的其他类似表单使用相同或非常相似的代码运行良好。但是我没有发现任何区别,也不知道什么时候或者什么时候为标题设置一个拖拽列

如前所述,只要调用标题上的弹出菜单(通过右键单击完成),在下次和以后打开表单时就会出现错误。当然,当没有附带弹出菜单时,只需右键单击标题不会导致任何问题,因此它肯定与弹出菜单相关

添加的弹出菜单如下所示:

header.setComponentPopupMenu(headerPopup);  
    public class TableActionListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        //System.out.println("command: " + command);
        switchCommands(command);
    }
}
还有一个ActionListener是这样的:

header.setComponentPopupMenu(headerPopup);  
    public class TableActionListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        //System.out.println("command: " + command);
        switchCommands(command);
    }
}
表单中只有一个实例:

public TableActionListener actionListener = new TableActionListener ();
并将其添加到每个菜单项中:

    JMenuItem mi = new JMenuItem(menuItem.title);
    mi.setActionCommand(menuItem.command);
    mi.addActionListener(actionListener);
    popup.add(mi); 
也许有人有过类似的经历,或者至少有理论知识来解释那里到底发生了什么

UPD: 在处理一个最小的工作示例时,我还注意到,当我在显示表单时删除了为表设置模型时,这样的错误就消失了,因此在我的
show
方法之前:

    @Override
    public void show () {
        objects.load();
        jtProblemTable.setModel(objects.tableModel);
...
现在在表单的构造函数中设置了表的模型,
show
方法是

    @Override
    public void show () {
        objects.load();
        objects.tableModel.fireTableDataChanged();
 ...
一切正常。虽然,这仍然是一个谜,为什么列被设置为拖动。。。继续努力吧

UPD2:
在对上一次更新进行了更改(很可能是修改了表单构造函数)之后,尽管恢复了更新之前的代码,但我无法再重现错误。所以,很可能是NetBeans 8.2的一个bug(我使用了它的图形表单编辑器)。当然,我以前做过很多次清理和构建项目,所以这不是很明显。

这似乎是一个NetBeans 8.2错误。在我对表单的构造函数做了一些更改之后,尽管将代码恢复到初始状态,我仍然无法再重现错误。

您能给我们一个简单的提示吗?