2016-11-16 47 views
0

我正在嘗試在IntelliJ中創建一個帶有兩列的JTable:一個是複選框,另一個是字符串。用戶可以通過按下一個JButton來向表中添加一個任意字符串,並且每次按下按鈕時,一個新行被添加到表中,其中第一列是複選框,第二列是任意字符串。這可以通過向表中添加任意數量的行來進行多次。通過點擊複選框並按下刪除按鈕,該行將從表格中刪除。整個過程都可以正常工作,但並不是我遇到的問題。爲JTable數據創建持久引用

每當用戶按下添加字符串到表的按鈕,我想將該字符串添加到一致的對象/容器。因此,在初始化的對象爲空,

Object[][] tableData; 

但是當按下按鈕的對象現在包含了「複選框」由布爾表示,該字符串。

Object[][] tableData = { 
    {false, "String"} 
} 

而這可能會持續一段時間。

Object[][] tableData = { 
    {false, "String"}, 
    {false, "String"}, 
    {false, "String"}, 
    {false, "String"}, 
    {false, "String"}, 
    {false, "String"} 
} 

若有布爾值獲取更改爲true(通過複選框)和刪除按鈕被按下,則該對象的特定「行」或部分被刪除。我將如何去創建這個對象或容器並維護它?有沒有更好的方法做到這一點沒有對象?

我現在所擁有的簡單概述如下。

String colNames = {" ", "String"}; 
DefaultTableModel tableModel = new DefaultTableModel(colNames, 0); 

importTable = new JTable(tableModel) { 
    @Override 
    public Class getColumnClass(int column) { 
     switch(column) { 
      case 0: 
       return Boolean.class; 
      default: 
       return String.class; 
     } 
    } 
}; 

importButton.addActionListener(new ActionListener() { 
    public void actionPerofrmed(ActionEvent e) { 
     Object[][] newData = { 
      {false, "String"} 
     }; 
     tableModel.addRow(newData[0]); 
    } 
}); 

removeButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     for (int i = 0; i < tableModel.getRowCount(); i++) { 
      Boolean checked = (Boolean) tableModel.getValueAt(i, 0); 
      if (checked) { 
       tableModel.removeRow(i); 
       i--; 
      } 
     } 
    } 
}); 

回答

1

這不正是你的表模型的用途嗎?如果你的表模型需要一個不同的數據「原子核」,那麼你需要使用一個ArrayList<CustomType>,其中CustomType是一個包含Boolean和String並且代表JTable中每行數據的類,然後擴展AbstractTableModel,爲其指定ArrayList上面,覆蓋必要的方法,一定要根據需要調用適當的方法,然後開始工作。

否則,堅持使用DefaultTableModel,並編寫代碼來簡單地將它轉換爲您需要的對象。

請注意,您的文章的一部分混淆了我 - 你使用不靈活和麪向對象的2D對象數組 - 爲什麼?

+0

在DefaultTableModel中使用「getValueAt」函數完美運行。至於你的問題,恐怕我不知道答案。這是我第一次用Java編寫這樣的東西。 – Kyleryan19