1

Modelのリストで構成されたを使用する作業プログラムがありItemます。

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 を作成する必要があります。特定のアイテムごとにそのフィールドの1つの列があるため、最初の問題は次のとおりです。そのため、アイテムごとに異なるテーブルが必要です。

解決策は、アイテムの種類ごとに 1 つのテーブルを持つ cardlayout を持つことですが、新しい問題が発生しinstanceof()ます。

さらに、この後に他の問題が発生します。ビューに x jtable がある場合、ビューはどのようにしてこのテーブルのモデルを取得しますか? 私はそのようなインターフェースを各アイテムに実装できます:

public interface MyModel{
AbstractTableModel getModel();
}

しかし、私はこの関数にリストしか与えることができないので、各アイテムはどのようにしてそのタイプのアイテムだけでデータ配列を埋めますか?

PS : 反射をさらに進めると、おまけの質問があります。アクション ボタンのリスナーが、どの JTable が現在変更されているかをどのように簡単に知ることができるのか疑問に思っています。カードレイアウト ?

私の質問を改善するために何かが必要な場合は、それを求めてください! 質問が現在明確かどうかはわかりません。

編集: 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

    }
}
4

1 に答える 1

3

TableModelランタイムタイプトークンとしてクラスリテラルを使用するジェネリック型をサポートします。(以下の)の実装はgetColumnClass()、テーブルの列で使用可能なタイプを定義し、デフォルト以外のレンダラーとエディターの選択を定義します。DefaultTableModelかなりの利便性を提供しますAbstractTableModelが、少しだけ難しく、実質的により柔軟です。具体的な例として、これEnvTableTestはでモデル化されたテーブルを示していますMap<String, String>

@Override
public Class<?> getColumnClass(int columnIndex) {
    // return a token for the specified column
}
于 2013-01-08T19:25:58.767 に答える