2012-01-26 110 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

相關問題