2013-06-22 20 views
-2

我嘗試了將近2個小時來弄清楚如何從JTable中刪除和更新1行,但不知何故,它不會工作。 我使用下面的代碼:從JTable中刪除1個選定的行

DefaultTableModel modelTable = (DefaultTableModel) jTabelRooster.getModel(); 

modelTable.addRow(new Object[]{lid.getLidnummer().toString(), lid.getLidvoornaam(), lid.getLidtussenvoegsel(),lid.getLidachternaam(), lid.getAanwezig()}); 

好到目前爲止好..行是很好的補充..但現在我想將其刪除:

int SelectedRow = jTabelRooster.getSelectedRow(); 
modelTable.removeRow(SelectedRow); 

當我這樣做我得到的以下錯誤: 異常在線程 「AWT-EventQueue的-0」 java.lang.ArrayIndexOutOfBoundsException:2> = 2

您的幫助,將不勝感激

編輯: 的jTabelRooster已經由GUI佈局管理器 inserterd所以我有這樣的代碼,現在,我沒有得到太多的更迭:

private void initRoosterDetail() 
{ 
    for(int i = 0; i < leden.size(); i++) 
     { 
      lid = leden.get(i); 

      modelTable.addRow(new Object[]{lid.getLidnummer().toString(), lid.getLidvoornaam(), lid.getLidtussenvoegsel(),lid.getLidachternaam(), lid.getAanwezig()}); 

     } 
} 
private void jbInschrijvingVerwijderenActionPerformed(java.awt.event.ActionEvent evt) {               
     int SelectedRow = jTabelRooster.getSelectedRow(); 
     modelTable.removeRow(jTabelRooster.convertRowIndexToModel(SelectedRow)); 
    } 

這一定是它:)

當我在表中選擇1行,按cancelbutton ..我收到此消息:

異常在線程 「AWT-EventQueue的-0」 java.lang.ArrayIndexOutOfBoundsException:2> = 2

============================================== ================================================== ================================================== ================================================== ================================================== ================================================== ================================

感謝所有的幫助...我知道我做了什麼錯誤的...它有一個tableModelListener我以前做的..所以這給我留下了另一個問題:)

jTabelRooster.getModel().addTableModelListener(
     new TableModelListener() 
     { 
     public void tableChanged(TableModelEvent evt) 
     { 
      if(jTabelRooster.getSelectedColumn() == 4) 
      { 
       } 
    } 

}); 

此代碼是搞亂了deleterow命令。

我有一個複選框1個布爾列中如果沒有選定的行,然後jTabelRooster.getSelectedRow()將返回-1

刪除檢查行是否選擇或因此才:(

+2

建議您在這裏得到一個快速體面的答案:創建併發佈一個非常小的可編譯,可運行的示例程序,我們可以不加修改地運行並演示您的問題,[sscce](http://sscce.org)。 –

+0

正如@HovercraftFullOfEels所建議的那樣發佈SSCCE或者至少是你的代碼的相關方法,這樣我們就不必匆忙地猜測錯誤的原因了......我的快速問題...顯示你的方法正在創建'modelTable'對象 –

+1

@ user2445977:請不要在註釋中張貼代碼,因爲它會丟失所有格式並變得不可讀。請使用新代碼編輯您的問題。而關於[sscce](http://sscce.org),你越早發佈它,越早得到正確的答案。也可以考慮回覆本網站上其他問題的答案。我們是志願者,希望知道您已花時間閱讀我們的貢獻以及是否有幫助。您的回覆將有助於激勵他人爲您提供更多幫助。 –

回答

2
int selectedRow = jTabelRooster.getSelectedRow(); 
modelTable.removeRow(SelectedRow); 

不是。

int selectedRow = jTabelRooster.getSelectedRow(); 
if(selectedRow != -1) { 
    modelTable.removeRow(selectedRow); 
} 

PS:嘗試遵循java命名約定。變量名應該以低案件。

編輯: 一個示例顯示如何使用表中的DefaultTableModel添加和刪除行。

private void createUI() { 
     JFrame frame = new JFrame(); 

     frame.setLayout(new BorderLayout()); 

     final JTable table = new JTable(); 
     final DefaultTableModel model = new DefaultTableModel(5, 3); 
     table.setModel(model); 

     JPanel btnPnl = new JPanel(new BorderLayout()); 
     JPanel bottombtnPnl = new JPanel(new FlowLayout(FlowLayout.CENTER)); 

     JButton addBtn = new JButton("Add"); 
     JButton deleteBtn = new JButton("Remove"); 
     bottombtnPnl.add(addBtn); 
     bottombtnPnl.add(deleteBtn); 

     addBtn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       model.addRow(new Object[]{}); 
      } 
     }); 

     deleteBtn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       int selRow = table.getSelectedRow(); 
       if(selRow != -1) { 
        model.removeRow(selRow); 
       } 
      } 
     }); 

     btnPnl.add(bottombtnPnl, BorderLayout.CENTER); 

     table.getTableHeader().setReorderingAllowed(false); 

     frame.add(table.getTableHeader(), BorderLayout.NORTH); 
     frame.add(table, BorderLayout.CENTER); 
     frame.add(btnPnl, BorderLayout.SOUTH); 

     frame.setTitle("JTable Example."); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
+2

這也是一個很好的建議,應該遵循,但不可能是錯誤的原因。通過錯誤消息「java.lang.ArrayIndexOutOfBoundsException:2> = 2」,我們知道'getSelectedRow()'返回2,但也知道rowCount已經是2了。有一些事情是原始海報不是向我們展示我們。我們已經要求更多的信息,這些信息可以讓我們不必猜測答案,但是由於不明原因,他仍然從我們那裏獲得更多信息。 –

+0

@HovercraftFullOfEels AFAIK我還是不明白,如果表中只有2行,OP如何將選中的行作爲2。由於這些行的索引將爲{0,1}。 – Amarnath

+0

我現在有一些成功..我使用selectedRow - 1 但是,我不能擺脫第一排:) – user2445977

2

我們只能說基於此代碼:

private void jbInschrijvingVerwijderenActionPerformed(java.awt.event.ActionEvent evt) {               
    int SelectedRow = jTabelRooster.getSelectedRow(); 
    modelTable.removeRow(jTabelRooster.convertRowIndexToModel(SelectedRow)); 
} 

與此錯誤:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2 

是由modelTable舉行某種程度上你的TableModel不同步與實際模型那是由jTabelRooster JTable持有的,就是這樣。我們知道這是因爲JTable中的選定行是第3行的行號2,但modelTable持有的模型顯示它僅包含2行。根據您迄今爲止提供的有限信息,我們無法猜測出現這種情況的原因或原因。

同樣,您應該強烈考慮創建併發布sscce