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

SwingWorkerに関するチュートリアルを読み、使用する

  • process()

  • publish()

  • setProgress()

通知、追加、削除、変更Swing JComponentsdoInBackground()

于 2012-09-01T06:40:59.057 に答える
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メソッドを使用することをお勧めします。いつ列を削除するか決められない場合は、worker が実行される前か、workersdoneメソッドで削除します。

于 2012-09-01T04:56:44.120 に答える