1

理論的には、AbstractTableModelを作成してjTableを編集不可にし、常にfalseを返すことで次のメソッドをオーバーライドできることを知っています(ただし、AbstractTableModelのデフォルトのメソッドはすでに存在するため、これは必要ありません) falseを返します)。

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

私はまだこれを私のコードに正しく機能させる方法を理解できないようです。私は何が間違っているのですか?これが私のコードです:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Datagrid extends AbstractTableModel {
    private static final long serialVersionUID = -1080095595481949205L;
    private String[] title;
    private String[][] data;
    private JTable table;
    private JFrame frm;

    public Datagrid(String[] title, String[][] data) {
        this.title = title;
        this.data = data;

        create_table();
    }

    public JTable getTable() {
        return table;
    }

    private void create_table() {
        table = new JTable(data, title);

        frm = new JFrame();
        frm.getContentPane().add(new JScrollPane(table));
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.pack();
        frm.setVisible(true);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public int getColumnCount() {
        return table.getColumnCount();
    }

    @Override
    public int getRowCount() {
        return table.getRowCount();
    }

    @Override
    public Object getValueAt(int row, int column) {
        return table.getValueAt(row, column);
    }

}
4

3 に答える 3

3

まず第一に、モデル内から UI 要素を作成しないでください...

次に、イベント ディスパッチ スレッドの外側から UI 要素を作成しないでください。

第三に(cubanacanが指摘したように)、モデルをテーブルに適用していません...

public static void main(String args[]) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            TableModel model = new Datagrid(); // <-- Create a new instance of the model
            table = new JTable(model);         // <-- Apply it to the table..

            frm = new JFrame();
            frm.getContentPane().add(new JScrollPane(table));
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.pack();
            frm.setVisible(true);
        }
    });
}

キュバナカンは燃えている...

第 4 に、次のコードはプログラムをクラッシュさせます。これらのメソッドは、テーブル自体を構成する方法を示すために、テーブルによって呼び出されます。

public int getColumnCount() {
    return table.getColumnCount();
}

@Override
public int getRowCount() {
    return table.getRowCount();
}

@Override
public Object getValueAt(int row, int column) {
    return table.getValueAt(row, column);
}

モデル化しようとしている内部データ構造を参照する必要があります。

表の使用方法を一読すると役立つ場合があります。

于 2012-11-09T08:36:19.963 に答える
2
  • への回答ではないisCellEditable、から削除するAbstractTableModel

.

public JTable getTable() {
    return table;
}

private void create_table() {
    table = new JTable(data, title);

    frm = new JFrame();
    frm.getContentPane().add(new JScrollPane(table));
    frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frm.pack();
    frm.setVisible(true);
}
  • ビューとモデルのロジックを分離する

  • この形式 (missing add, removerow, setValueAt(...)) では、JTablesビューからAbstractTableModel

  • そこが恋しいColumnClass

  • JTables ビューのすべてのデータは次の場所に保存されますXxxTableModel

  • AbstractTableModelAPI で実装されたメソッド ( Object[]/ Double[]/ String[]... およびVector<Object>/ Vector<String>... )については非常に正しい

于 2012-11-09T08:37:56.487 に答える
2

ここにはいくつかの問題があります。

  1. テーブル モデルを JTable に設定していません。
  2. テーブルモデルを設定すると、 を取得します。これはStackOverflowError、呼び出すtable.getRowCount()と が呼び出されるためですgetModel().getRowCount()
  3. テーブル モデルを設定すると、コンストラクターで指定された列のタイトルは取得されません。詳細については、メソッドAbstractTableModel#getColumnName(int)のjavadoc を参照してください。

コードに基づく実行可能で実用的なソリューションは次のとおりです。

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Datagrid extends AbstractTableModel {
    private static final long serialVersionUID = -1080095595481949205L;
    private String[] title;
    private String[][] data;
    private JTable table;
    private JFrame frm;

    public Datagrid(String[] title, String[][] data) {
        this.title = title;
        this.data = data;

        create_table();
    }

    public static void main(String[] args) {
        String[] columnTitles = {"Title 1", "Title 2"};
        String[][] tableData = {{"Value 1", "Value 2"}, {"Another Value 1", "Another Value 2"}};
        new Datagrid(columnTitles, tableData);
    }

    public JTable getTable() {
        return table;
    }

    private void create_table() {
        table = new JTable(data, title);
        table.setModel(this);
        frm = new JFrame();
        frm.getContentPane().add(new JScrollPane(table));
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.pack();
        frm.setVisible(true);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public int getColumnCount() {
        return title.length;
    }

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

    @Override
    public Object getValueAt(int row, int column) {
        return data[row][column];
    }

    @Override
    public String getColumnName(int column) {
        return title[column];
    }

}
于 2012-11-09T09:01:07.530 に答える