странное поведение при добавлении JLabel в ячейку JTable - PullRequest
0 голосов
/ 27 января 2012

У меня тут странная штука.Я пытаюсь добавить JLabel в ячейку JTable.Значок метки может меняться в зависимости от некоторых критериев.Я создал фиктивный проект со следующими характеристиками: 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....]

Код такой для 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;
    }
}

Вот код для класса тестирования:

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

Я действительно запутался, почему это происходит, сообщение не очень проясняет вопрос.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 27 января 2012

1) вы не можете поместить JLabel в ячейку, ячейка по умолчанию возвращает JComponent/JLabel

2) вы не можете поместить Icon в JLabel, поставить Icon вJTable напрямую

3) ваш AbstractTableModel имеет ошибку, которую вы объявляете для Object[][]/Object[], а Model основан на Vector, изменяя Object[][] на Vector<Vector<Object>> / Object[] на Vector<String> вы можете удалить эту проблему

4) не используйте AbstractTableModel, нет причин, если вы не можете ограничивать или переопределять методы из DefaultTableModel

4 голосов
/ 27 января 2012

Вы не опубликовали сообщение, ни в чем проблема.Но, просто взглянув на ваш код, я уже могу отметить ряд проблем

  1. Зачем хранить JLabel экземпляры в вашем TableModel.Если вы хотите визуализировать содержимое ваших TableModel с использованием JLabel экземпляров, вы можете сделать это в рендерере
  2. Ваша реализация TableModel возвращает 0 как для модели, так и для количества строк (см. Ваш getColumnCount() и getRowCount() методы)
  3. Ваш getValueAt всегда возвращает null, что приводит к NullPointerException в вашем getColumnClass методе, поскольку вы используете getValueAt(0, columnIndex).getClass()
  4. Пожалуйста, позвонитесодержание вашего основного метода в EDT

Сначала решите их и посмотрите, что произойдет

0 голосов
/ 17 декабря 2013

Если использовать JXTreeTable, я установлю в столбце 0 тип метки

ArrayNode dataRow = new ArrayNode(new Object[]{new JLabel("text",icon), ...});
// add Root --> Set TreeTableModel

.......

jxTreeTable.setTreeCellRenderer(new TreeCellRenderer() {
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        AbstractMutableTreeTableNode data = (AbstractMutableTreeTableNode) value;
        if (data.isLeaf()) {// Is Leaf as Label 
            return (JLabel) data.getValueAt(0); // Value 0 is a label
        } else if(data.getValueAt(0)!=null){ // Is Root
            return new JLabel(data.getValueAt(0).toString());
        }else{ // IsRoot, but is Cell Null Value
            return new JLabel("");
        }  
    }
});
...