我希望有以下功能:通过单击列的标题,我可以选择该列并隐藏其他列。同时,我想显示所选列的语义缩放信息。
现在我只是为选定的标题注册一个鼠标侦听器,但得到以下异常:
[相关异常信息]
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 50, Size: 50
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at TableModelSwitch.getValueAt(Unknown Source)
atjavax.swing.table.TableRowSorter$TableRowSorterModelWrapper.getValueAt(TableRowSorter.java:269)
at javax.swing.table.TableRowSorter$TableRowSorterModelWrapper.getStringValueAt(TableRowSorter.java:285)
at javax.swing.DefaultRowSorter.compare(DefaultRowSorter.java:952)
at javax.swing.DefaultRowSorter.access$100(DefaultRowSorter.java:112)
at javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1376)
at javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1366)
我想知道为什么 JTable 中的点击事件会与 TableModel 类中的 getValueAt() 方法相关。对于所有教授添加鼠标侦听器以单击标题的示例,也没有人提及这部分。谁能帮我找出问题所在?寄存器部分代码如下:
public MyJTable() {
super();
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
JTableHeader header = getTableHeader();
if (header.equals(e.getSource())){
if (e.getClickCount()==2){
int index = convertColumnIndexToModel(columnAtPoint(e.getPoint()));
if (index >= 0) {
System.out.println("Clicked on column " + index);
}
}
} else { //clicking event when clicking any cell of this Table
}
});
我以为可能是因为 header==null,所以没有机会进入第一个 if 条件。但是,在检查之后,header!=null 并且我已经在 myAbstractTableModel 中覆盖了 getColumnName。所以现在我的想法已经用完了......
[新编辑]
现在我尝试为 header 添加监听器,但错误是一样的。我发现当我双击表头时,异常与上面相同,并且还显示了我编码时选择的表头信息。我猜这个例外是因为表的标题有排序监听器。我试图 setAutoCreateRowSorter(false); 还有 summaryHeader.setReorderingAllowed(false); 但它仍然不起作用。相关新代码如下:
public JTableSummary() {
super();
setAutoCreateRowSorter(false);
JTableHeader summaryHeader = this.getTableHeader();
summaryHeader.setReorderingAllowed(false);
summaryHeader.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount()==2){
int index = convertColumnIndexToModel(columnAtPoint(e.getPoint()));
if (index >= 0) {
System.out.println("Clicked on column " + index);
}
//}
}
});
我想当前的问题是如何有效地禁用标题排序监听器(我可以看到排序图标 - 当我单击标题时出现向上/向下的三角形)并使我自己的监听器可用?
在此先感谢您的帮助!