1

私はテーブルのタイプを実装しています。これを行うために、私は を使用しましたAbstractTableModelが、コードが何をしているのかわかりません (そのため、彼の仕事をしたスニペットを取得しますが、明らかに理解したいです)。コードを見ることができます

public class TablePanel extends JPanel
{
    private JTable table;
    public TablePanel()
    {
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
        table = new JTable(new MyTableModel());
        table.setFillsViewportHeight(true);     
        table.setPreferredScrollableViewportSize(new Dimension(500, 100));
        JScrollPane jps = new JScrollPane(table);
        add(jps);
        add(new JScrollPane(table));
        table.setCellSelectionEnabled(true);
    }
    private class MyTableModel extends AbstractTableModel {
        private String[] columns = {"","Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        private String[][] data = {{"8:30 - 9:30","","","","","",""},
            {"9:30 - 10:30","","","","","",""},
            {"10:30 - 11:30","","","","","",""},
            {"11:30 - 12:30","","","","","",""},
            {"12:30 - 13:30","","","","","",""},
            {"13:30 - 14:30","","","","","",""},
            {"14:30 - 15:30","","","","","",""},
            {"15:30 - 16:30","","","","","",""},
            {"16:30 - 17:30","","","","","",""}};

        public int getColumnCount() {
            return columns.length;
        }

        public int getRowCount() {
            return data.length;
        }

        public String getColumnName(int col) {
            return columns[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }
        public Object myMethod (){
            //do something
        }
    }
}

さて、それはどういう意味table = new JTable(new MyTableModel());ですか?
その例だと思っていましたtableMyTableModel、そうではありません。実際、 table を別の外部クラスに渡すと、このクラスはmyMethodの本体で定義されたメソッドを認識しませんMyTableModel

4

3 に答える 3

1

AMyTableModelは ですが、TableModel必ずしもであるTableModelとは限りませんMyTableModel

テーブルのモデルが のインスタンスでMyTableModelあり、目的の があることを知っているのでmyMethod()、キャストを使用できます。

JTable table = new JTable(new MyTableModel());
MyTableModel model = (MyTableModel) table.getModel();

モデルへの参照を作成して使用する方が簡単な場合があります。

MyTableModel model = new MyTableModel();
JTable table = new JTable(model);

ここsetValueAt()に示すの実装を含めることを怠らないでください。

于 2013-09-14T17:50:18.640 に答える
0

JTable コンストラクターは、TableModelインターフェースを実装するクラスの任意のオブジェクトを受け入れます

これは、より多くのことを学ぶのに役立ちます。

于 2013-09-14T17:21:37.033 に答える
0

MyTableModel が単なる AbstractTableModel であると「考えている」ため、他のクラスが関数 myMethod を認識できないという予想される動作 (実際にはそうではありません) OOP言語を使用しているためです

だからあなたは間違っていません。MyTableModel のインスタンスを作成しているので、呼び出すと内部で行うすべてのことが実行されます

ここでは、OOP 部分について詳しく説明しています: http://www.dummies.com/how-to/content/understanding-javas-objectdirectional-programming-oop.html

簡単に言うと

myMethod 関数にアクセスする必要がある場合は、次のようにキャストするだけです。 // MyTableInstance を作成します (これは、AbstractTableModel が親で、MyTableModel が子であるため可能です)。

 // Now to be able to call this:
 // atmTestVariable.myMethod();
 // we need to do this:

 if(atmTestVariable isntanceof MyTableModel) //make sure that atmTestVariable is REALY a MyTableModel
 {
    MyTableModel mtmTemp = (MyTableModel)atmTestVariable; //cast to MyTableModel
    mtmTemp.myMethod(); //Call the function
    // and now the short variant:
    ((MyTableModel)atmTestVariable).myMethod(); //cast to MyTableModel AND call the function
 }

うまくいけば、私は助けることができました

MyTabelModel クラスの定義を別のファイルに移動してください : /

于 2013-09-14T17:36:51.550 に答える