3

要仅从 JTable 的视图中隐藏一列,我正在使用该removeColumn()方法。但它抛出异常

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 7 >= 7
at java.util.Vector.elementAt(Vector.java:470)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)
at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:648)

我认为,从视图中删除列后,如果我修改了模型,则会弹出此异常。是因为模型正在更新表时视图中没有列吗?

在 JTable 中隐藏列的最佳方法是什么?而不是将大小设置为 0

编辑:异常不会定期发生。这是一个随机例外。无论如何这里是代码:

    @Override
        protected Object doInBackground() throws Exception {
        ........
        resultDTO=//get data from database
        tableModel.setDataVector(resultDTO.getAllRows(), tableModel.getColumnNames());    
        // hide column
        table.removeColumn(table.getColumnModel().getColumn(7));
            System.out.println("table column count : " + table.getColumnCount());
            System.out.println("model column count : " + tableModel.getColumnCount());
        ........
        .........       
        }



initial result (with out any data in table, at application startup): 
table column count : 7
model column count : 8

after populating data (first running of above method):
table column count : 7
model column count : 8

after few times executing : 
table column count : 7
model column count : 8
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 7 >= 7
    at java.util.Vector.elementAt(Vector.java:470)
    at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:294)
    at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:648)
    at javax.swing.plaf.synth.SynthTableHeaderUI.paint(SynthTableHeaderUI.java:173)

有时当我第一次加载数据时会发生上述异常,有时则不会。

4

2 回答 2

1

您正在尝试在Event Dispatching Thread之外更新 UI 组件,这绝不是一个好主意

protected Object doInBackground() throws Exception {
    ........
    resultDTO=//get data from database
    // This shouldn't be done here
    tableModel.setDataVector(resultDTO.getAllRows(), tableModel.getColumnNames());  
    // and neither should this
    // hide column
    table.removeColumn(table.getColumnModel().getColumn(7));

竖起大拇指使用SwingWorker虽然。问题是,Swing 组件不是线程安全的,您永远不应该尝试在 EDT 之外更新它们,因为它们会导致意外结果(就像您刚刚遇到的那样)。

我建议使用publish/process方法,而不是直接设置行数据。如果您无法决定何时删除该列,我会在工作人员执行之前或在工作人员done方法中删除它

于 2012-09-01T04:56:44.120 回答
1

阅读有关SwingWorker的教程并使用

  • process()

  • publish()

  • setProgress()

用于通知、添加、删除、Swing JComponents修改doInBackground()

于 2012-09-01T06:40:59.057 回答