3

ユーザーがダブルクリックしたときに、JTableのすべてのセルを編集できないようにしようとしています。私は多くのフォーラム投稿を読みましたが、一般的なコンセンサスは、新しいテーブルモデルクラスを作成し、DefaultTableModelを拡張してから、メソッドisCellEditable(int row、int column)をオーバーライドすることです。私はこれをすべて実行しましたが、プログラム(アプレット)を実行すると、セルに何も表示されません。今学期には、アプレットが古くなっているとは思わない教授がいます...

テーブルモデルのコード:

public class MyTableModel extends DefaultTableModel
{
    public boolean isCellEditable(int row, int column)      //override isCellEditable
    //PRE:  row > 0, column > 0
    //POST: FCTVAL == false always
    {
        return false;
    }
}

    Code in my class:  **NOTE** this class extends JPanel 

    private JScrollPane storesPane;                
    private JTable storesTable; 

    Code in the Constructor:             

    storesTable = new JTable(tableData, COL_NAMES);    //tableData and COL_NAMES are passed in
    storesTable.setModel(new MyTableModel());

    storesPane = new JScrollPane(storesTable);
    storesTable.setFillsViewportHeight(true);
    add(storesPane, BorderLayout.CENTER);     

うまくいけば、JavaGurusが私のエラーを見つけることができるでしょう:)

4

4 に答える 4

6

この行は新しい JTable を作成し、暗黙的に DefaultTableModel をバックグラウンドで作成します。このモデルには、JTable に必要なすべての正しいデータが保持されます。

storesTable = new JTable(tableData, COL_NAMES);

そして、この行は、上記で暗黙的に作成されたテーブル モデル (テーブルのすべてのデータを保持するテーブル モデル) を効果的に削除し、データをまったく保持しないテーブル モデルに置き換えます。

storesTable.setModel(new MyTableModel());

MyTableModel クラスにコンストラクターを指定し、そのコンストラクターでスーパー コンストラクターを呼び出して、現在コンストラクターでテーブルに渡しているデータを渡す必要があります。

例えば、

public class MyTableModel extends DefaultTableModel {

   public MyTableModel(Object[][] tableData, Object[] colNames) {
      super(tableData, colNames);
   }

   public boolean isCellEditable(int row, int column) {
      return false;
   }
}

次に、次のように使用できます。

MyTableModel model = new MyTableModel(tableData, COL_NAMES);
storesTable = new JTable(model);
于 2011-12-04T02:34:53.733 に答える
3

クラスのisCellEditableメソッドをオーバーライドするだけです。DefaultTableModelこれを行う簡単な方法:

JTable table = new JTable();
DefaultTableModel dtm = new DefaultTableModel(0, 0) {
    public boolean isCellEditable(int row, int column) {
        return false;
    }
};
table.setModel(dtm);
于 2015-06-02T18:51:37.837 に答える