3

AbstractTableModelを使用してカスタムTableModelを作成しました。JTableにデータを入力できます。しかし、私のJTableには、「Button1」というボタン列があります。そのため、CellRendererメソッドを使用して列にボタンを追加し、CellEditorを使用してアクションを追加していますが、LINE:3で例外が発生しています。

CustomModelForTable customTableModel = new CustomModelForTable(colNames, data);
tableA = new JTable(customTableModel);

**LINE:3** 
tableA.getColumn("Button1").setCellRenderer(new JButtonRendererClass());
tableA.getColumn("Button1").setCellEditor(new ButtonEditor(new JCheckBox()));

次のエラーが発生します。

java.lang.IllegalArgumentException: Identifier not found
at javax.swing.table.DefaultTableColumnModel.getColumnIndex(DefaultTableColumnModel.java:265)

カスタムテーブルから列を取得できないため、このエラーが発生します。しかし、誰かがこの問題で私を助けることができますか?

このタスクを実行するために次のソースを使用しています。このソースでは、彼らはDefaultTableModelを使用していますが、私の場合と同様に、を使用していAbstractTableModelます。

4

2 に答える 2

3

1.@camickrによるテーブルボタン列を使用します

2. JButtoninはに格納されていることをJTable表し、次にオーバーライドする必要がありますString valueXxxTableModelColumnClass

     public Class getColumnClass(int column) {
        switch (column) {
            case 0:
                return Date.class;
            case 1:
                return Integer.class;
            case 2:
                return Long.class;
            case 3:
                return Double.class;
            case 4:
                return Boolean.class;
            case 5:
                return Icon.class;
            default:
                return String.class;
        }
    }

列のセルは編集可能である必要があります

    public boolean isCellEditable(int row, int col) {
        switch (col) {
            case 0:
                return false;
            case 1:
                return false;
            default:
                return true;
        }
    }

3.すべてはあなたに関するものですAbstractTableModel、多分それを使用する理由はありません、DefaultTableModel前に使用してください、あなたが理解している場合、あなた はのためのメソッドをHow XxxTableModel worksオーバーライドすることができますJTableAbstractTableModel

于 2012-09-12T05:59:27.227 に答える
3

識別子で列を取得するには、TableColumn.setIdentifier()を使用して列を設定する必要があります。

編集:

の仕様によると、次のことに注意してくださいTableColumn.getIdentifier()

識別子が null の場合、getIdentifier() はデフォルトとして getHeaderValue を返します。

それが、リンクされた例でどのように機能するかです。

編集:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.GridLayout;

public class TableDemo extends JPanel {
    public TableDemo() {
        super(new GridLayout(1,0));

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

        JScrollPane scrollPane = new JScrollPane(table);

        add(scrollPane);

        table.getColumn("Column1").setCellRenderer(new TestCellRenderer());
        table.getColumn("Column2").setCellRenderer(new TestCellRenderer());
    }

    class TestCellRenderer extends DefaultTableCellRenderer{ }

    class MyTableModel extends AbstractTableModel {
        private String[] columnNames = { "Column1", "Column2" };
        private Object[][] data = { { "1", "1" }, { "2", "2" } };

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

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

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

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

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("TableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TableDemo newContentPane = new TableDemo();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
于 2012-09-12T05:11:20.013 に答える