2012-09-01 162 views
3

要僅隱藏JTable視圖中的列,我正在使用removeColumn()方法。但它拋出異常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) 

有些時候上述異常發生時,我第一次加載數據,有時它不是。

+0

我看到異常是從模型中同時嘗試繪畫拋出。模型是否有可能報告說,在刪除一個並將其減少到7之後,總共有8個列?這裏我們沒有太多的信息可以繼續。 – arcy

+0

看起來像是類似於[Bug ID:6586009](http://bugs.sun.com/view_bug.do?bug_id=6586009) – tenorsax

+0

您是否試圖從EDT以外的模型中移除柱子? – MadProgrammer

回答

1

你試圖更新UI組件出Event Dispatching Thread的一面,這是不是一個好主意了對使用SwingWorker雖然

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

大拇指。問題是,Swing組件不是線程安全的,你不應該試圖在他們之外更新它們,因爲它們會導致意想不到的結果(就像你剛剛裝上的那樣)。

而不是直接設置行數據,我建議使用publish/process方法。如果你不能決定何時刪除該列,我會刪除它之前的工人執行,或在工人done方法

+0

好的,我只想知道關於鞦韆工人的一件事。如果在執行doInBackground()期間發生任何異常,那麼會發生什麼? – Sanjeev

+0

@sanjeev這是一個很好的問題! 'doInBackground'是從'Callable'中調用的,然後由'ExecutorService'啓動......通常,它們會被吸收......在執行後無法獲得對'Callable'的引用。然而,你可以添加一個try/catch塊來阻止你的代碼並捕獲可能拋出的任何執行,然後我會保留一個可以在以後獲得的引用,比如'done'方法 – MadProgrammer

1

閱讀教程的SwingWorker和使用

  • process()

  • publish()

  • setProgress()

的通知,添加,刪除,修改Swing JComponentsdoInBackground()