Unable to get column index with table.getColumn method using custom table Model

对着背影说爱祢 提交于 2019-12-11 02:53:23

问题


I have created a custom TableModel using AbstractTableModel. I am able to populate my JTable. But my JTable has a button column say "Button1". So I am using CellRenderer method to add buttons to column and CellEditor to add actions, but I am getting exception at 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()));

I am getting the following error.

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

I am getting this error because I am not able to get the Column from my custom Table. But can some one help me out with this issue.

I am using the following source to perform this task. In this source they are using DefaultTableModel where as in my case I am using AbstractTableModel.


回答1:


In order to retrieve columns by identifier, you have to set one using TableColumn.setIdentifier().

EDIT:

Note that according to specs of TableColumn.getIdentifier():

If the identifier is null, getIdentifier() returns getHeaderValue as a default.

That is how it works in the linked example.

EDIT:

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();
            }
        });
    }
}



回答2:


1.use Table Button Column by @camickr

2.JButton in JTable represents String value stored in XxxTableModel, then have to override the ColumnClass

     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;
        }
    }

Cells in the Column should be editable

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

3.everything is about your AbstractTableModel, maybe there no reason use that, use DefaultTableModel before, in the case that you understand How XxxTableModel works, then you can to override methods for JTable with AbstractTableModel



来源:https://stackoverflow.com/questions/12381497/unable-to-get-column-index-with-table-getcolumn-method-using-custom-table-model

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!