Java 为什么设置JTable header列?
在JPanel表单中有一个JTable。由于某些原因,在对表单执行某些操作后,在第二次(以及所有后续时间)打开表单时,我开始收到以下错误: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)
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错误。在我对表单的构造函数做了一些更改之后,尽管将代码恢复到初始状态,我仍然无法再重现错误。您能给我们一个简单的提示吗?