1

我希望有以下功能:通过单击列的标题,我可以选择该列并隐藏其他列。同时,我想显示所选列的语义缩放信息。

现在我只是为选定的标题注册一个鼠标侦听器,但得到以下异常:

[相关异常信息]

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);
                    }
                //} 
            }
    });

我想当前的问题是如何有效地禁用标题排序监听器(我可以看到排序图标 - 当我单击标题时出现向上/向下的三角形)并使我自己的监听器可用?

在此先感谢您的帮助!

4

0 回答 0