2013-01-08 23 views
1

我有一個工作程序,使用由Item列表組成的Model創建不同的JTable,同時保留泛型

public class Model { 
private List<Item>;} 

public abstract class Item{} 

public class A extends Item{} 
public class B extends Item{} 
public class C extends Item{} 

但現在我需要在表示特定的項目(A,B,C)的中心創建具有一些動作按鈕(添加,刪除,編輯)配有一個JTable的圖。 這是我的第一個問題,因爲每個特定的項目將有一個字段的列,所以我需要爲每個項目不同的表。

一個解決方案可能是爲每種類型的物品配一張表格,但是會出現一個新問題,我的視圖如何確定模型中存在多少類型的物品而不使用instanceof()

此外,我會在這之後有其他問題,如果我在我的視圖中有x jtable我的視圖將如何獲得此表的模型?我可以實現對每一個項目這樣的接口:

public interface MyModel{ 
AbstractTableModel getModel(); 
} 

,但我只能給這個函數的清單,讓每個項目將如何填充數據陣列,只有其項目類型?

PS:如果我進一步在我的反思我有一個獎金問題,我想知道如何我的動作按鈕的偵聽器可以簡單地知道哪些JTable當前正在修改,我應該把聽衆放在視圖中爲了簡單訪問cardlayout?

如果有什麼需要改善我的問題,要求它!不確定這個問題目前是否清楚。

編輯:添加SSCCE,這是我瞄準但它目前不使用我的程序的項目,並沒有實現TableModel/TableModelListener。

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.JTable; 
import javax.swing.event.TableModelEvent; 
import javax.swing.event.TableModelListener; 


public class View extends JPanel implements TableModelListener{ 

    private static final long serialVersionUID = 1L; 
    private JTabbedPane card; 

    public View() { 
     Object rowData[][] = { { "1", "one", "I" }, { "2", "two", "II" }, { "3", "three", "III" } }; 
     String columnNames[] = { "#", "English", "Roman" }; 
     Object rowData2[][] = { { "1", "B" } }; 
     String columnNames2[] = { "#", "type" }; 
     setLayout(new BorderLayout()); 
     JPanel actionbutton = new JPanel(); 
     JButton but = new JButton("fire"); 
     but.addActionListener(new ButtonListener()); 
     actionbutton.add(but); 
     add(actionbutton,BorderLayout.SOUTH); 
     card = new JTabbedPane(); 
     //something should determine how many type of object in a List<Item> w/o using instanceof 
     //should fill jtable with a specific TableModel for each item type 
     JTable card1 = new JTable(rowData,columnNames); 
     JTable card2 = new JTable(rowData2,columnNames2); 
     card.addTab("Item A",new JScrollPane(card1)); 
     card.addTab("Item B",new JScrollPane(card2)); 
     add(card,BorderLayout.CENTER); 

    } 

    private class ButtonListener implements ActionListener{ 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String cmd = e.getActionCommand(); 
      if ("fire".equals(cmd)) { 
        //do something on the model 
      } 
     } 

    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     f.setSize(800, 600); 
     f.add(new View()); 
     f.setVisible(true); 
    } 

    @Override 
    public void tableChanged(TableModelEvent e) { 
     //update jtable with the model's modification 

    } 
} 
+0

你的意思是,每個項目類將有不同數量的,你想JTable中列顯示的屬性? – Randy

+1

有一堆關於基於'util.List'的'AbstractTableModel'的線程,參見相關(左下),剩餘的問題可能是un_rellated,沒有發佈[SSCCE](http://sscce.org/),short ,可運行,可編譯, – mKorbel

+0

是的,每個項目都有不同數量的屬性,所以我需要爲它們中的每一個製作不同的JTable,製作不同的模型 –

回答

3

TableModel支持使用Class Literals as Runtime-Type Tokens的泛型類型。您的getColumnClass()(如下)的實施定義了表格列的可用類型,並定義了任何非默認renderers and editors的選擇。雖然DefaultTableModel提供了相當大的便利,AbstractTableModel只是稍微困難一點,而且更加靈活。作爲一個具體的例子,這個EnvTableTest舉例說明了一個建模在Map<String, String>上的表格。

@Override 
public Class<?> getColumnClass(int columnIndex) { 
    // return a token for the specified column 
} 
+0

我完全同意這一點,但我想我沒有正確解釋我的問題。例如,當我爲A創建我的JTable時,我會給出一個Default或AbstractTableModel,但是我需要將數據放入此模型中?但我怎麼能填充這個數據只有對象的同一類型的A,如果我使用instanceof()這應該是我犯了一個錯誤ealier沒有? 對於其他我已經檢查EnvTableTest,我知道如何使自定義ColumnName等。 –

+0

哎呀,對不起,我的意思是'getColumnClass()'。是的,你的'TableModel'可以根據需要公開你的應用程序的數據模型。 – trashgod

+0

那麼,那不是我正在尋找的,但它可以幫助以後,謝謝。 我覺得我的英文不夠熟練,不能解釋我的問題,只會做一個醜陋的代碼來獲取項目的不同實例的代理它應該解除阻止我,然後我可以專注於TableModel實現,但EnvTableTest似乎回答所有這個問題我可以。 –

相關問題