在JTable单元格中添加JLabel时的奇怪行为

Ale*_*oVK 0 java swing jtable jlabel

我在这里遇到了一件奇怪的事情。我正在尝试在JTable单元内添加JLabel。标签图标可能会根据某些条件发生变化。我根据以下规范创建了一个虚拟项目:http : //javanepal.wordpress.com/2010/06/30/adding-jlabel-in-jtable/

而且效果很好。我将TableModel更改为从AbstractTableModel而不是DefaultTableModel扩展,现在添加一行时,如果检查Object [],则可以得到此信息:

[javax.swing.JLabel[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,
flags=8388608,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,
disabledIcon=,horizontalAlignment=LEADING,horizontalTextPosition=TRAILING,
iconTextGap=4,labelFor=,text=Row  1,Col1,verticalAlignment=CENTER,
verticalTextPosition=CENTER], whatever....]
Run Code Online (Sandbox Code Playgroud)

对于TableModel,代码是这样的:

public class MyModel extends javax.swing.table.AbstractTableModel {

    Object[][] row = {{new JLabel("Row 1 Col 1"), "Row 1 Col 2", "Row 1 Col3"},
        {new JLabel("Row 2 Col 1"), "Row 2 Col 2", "Row 2 Col3"},
        {new JLabel("Row 3 Col 1"), "Row 3 Col 2", "Row 3 Col3"},
        {new JLabel("Row 4 Col 1"), "Row 4 Col 2", "Row 4 Col3"}};
    Object[] col = {"Column 1", "Column 2", "Column 3"};
    protected Vector<Object> data;

    public void addRow(Object o[]) {
        for (int i = 0; i < o.length; i++) {
            if (o[i] == null) {
                o[i] = new String();
            }
        }
        data.addElement(o);
        fireTableRowsInserted(data.size() - 1, data.size() - 1);
    }

    public MyModel() {
        super();
        data = new Vector<Object>();
        //Adding rows
        for (Object[] r : row) {
            addRow(r);
        }
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        if (columnIndex == 0) {
            return getValueAt(0, columnIndex).getClass();
        } else {
            return super.getColumnClass(columnIndex);
        }
    }

    @Override
    public int getColumnCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int getRowCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Object getValueAt(int arg0, int arg1) {
        // TODO Auto-generated method stub
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是测试类的代码:

public class MyTableTest extends JFrame {

    public MyTableTest(String title) {
        super(title);
        showGUI();
    }

    public void showGUI() {
        JTable table = new JTable();
        table.setModel(new MyModel());//invoking our custom model
        //loadMessages(table);
        table.setDefaultRenderer(JLabel.class, new Renderer());// for the rendering of cell
        JScrollPane jp = new JScrollPane(table);
        getContentPane().add(jp);
        setVisible(true);
        setSize(500, 300);
    }

    public static void main(String[] args) {
        MyTableTest t = new MyTableTest("Table Custom");
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的很困惑为什么会这样,关于该问题的消息不是很清楚。

谢谢!

mKo*_*bel 5

1)你不能放到JLabelCell,默认情况下Cell会返回JComponent/JLabel

2)你不能把IconJLabel,把IconJTable直接

3)你AbstractTableModel有错误,你的声明Object[][]/Object[],并Model基于Vector通过改变Object[][]Vector<Vector<Object>>/ Object[]Vector<String>您可以删除这个问题

4)不要使用AbstractTableModel,如果您不能限制或覆盖以下方法,则没有理由DefaultTableModel