2012-01-26 113 views
0

我在这里遇到了一个奇怪的事情。我试图在JTable单元格中添加一个JLabel。标签图标可能会根据某些标准更改。我从这里创建了一个虚拟项目:http://javanepal.wordpress.com/2010/06/30/adding-jlabel-in-jtable/在JTable单元格中添加JLabel时出现的奇怪行为

它工作正常。我改变了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"); 
    } 
} 

我真的很困惑,为什么出现这种情况,该消息是不是很澄清有关问题。

谢谢!

回答

4

您没有发布消息,也没有问题是什么。但就看你的代码,我已经可以此话的一些问题

  1. 何必存储JLabel情况下,在你TableModel。如果你想使用JLabel实例来渲染TableModel的内容,你可以在渲染
  2. TableModel实现两者的模型和行数返回0做到这一点(请参阅您getColumnCount()getRowCount()方法)
  3. getValueAt总是返回null,导致NullPointerExceptiongetColumnClass的方法,因为你使用getValueAt(0, columnIndex).getClass()
  4. ,请拨打EDT
你的主要方法的内容0

解决这些第一,看看会发生什么

+1

hehehe把两个答案放在一起,现在会有宝贵的答案,+1 – mKorbel 2012-01-26 23:54:57

+0

@mKorbel确实。看起来我们都错过了一些观点(或者让对方分享赞赏)。+1为你的答案 – Robin 2012-01-26 23:56:54

+0

@Robin那么代码是一个混合的例子和我实际使用的表格,并在睡觉前做了,真的很累,并没有打扰未实现的方法。第一点是绝对正确的,并将我引向解决方案。我只是检查呈现器中的列索引,并返回一个JLabel而不是一个String。谢谢! +1和正确的答案:) – AlejandroVK 2012-01-27 08:46:04

4

1)你不能把JLabel的细胞,细胞默认返回JComponent/JLabel

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

3)您AbstractTableModel有错误,你申报Object[][]/Object[]Model基于Vector,通过改变Object[][]Vector<Vector<Object>>/Object[]Vector<String>你ç这个问题

4)不使用AbstractTableModel的删除,没有任何理由,如果你不能限制或DefaultTableModel

0

替代方法如果使用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(""); 
     } 
    } 
}); 
+0

缺少一个'}'括号。 Alo,你会不会发表评论,它实际上与这个问题有什么关系? – Kamiccolo 2013-12-17 16:25:05

+0

谢谢! Kamiccolo – 2013-12-23 07:49:30

相关问题