2012-01-26 4 views
0

私はここで奇妙なことに走っています。 JTableセル内にJLabelを追加しようとしています。ラベルアイコンは、いくつかの基準に基づいて変更されることがあります。私はここから仕様書に沿ってダミープロジェクトを作成しました:http://javanepal.wordpress.com/2010/06/30/adding-jlabel-in-jtable/JTableセルにJLabelを追加するときに奇妙な動作が発生する

そしてそれはうまく動作します。

[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のために、このです:私は、オブジェクト[]を検査する場合、私はAbstractTableModelに代えてのDefaultTableModelから延びるようにする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

あなたはメッセージを投稿しておらず、問題は何もありません。しかし、単にあなたのコードを見て、私はすでに、なぜあなたTableModelJLabelのインスタンスを格納わざわざ問題

  1. の数を発言することができます。あなたがJLabelのインスタンスを使用してTableModelの内容をレンダリングしたい場合は、(あなたのgetColumnCount()getRowCount()方法を参照してください)
  2. あなたTableModel実装がモデルと行数の両方に0を返すレンダラでこれを行うことができます
  3. あなたgetValueAtいつもあなたがEDT
であなたのmainメソッドの内容を呼び出してください getValueAt(0, columnIndex).getClass()
  • を使用するので、あなたのgetColumnClass方法でNullPointerExceptionにつながる、nullを返します。 0

    直接JTableIconを入れて、あなたはJLabelIconを置くことはできません)を使用すると、デフォルトの戻りJComponent/JLabel

    2により、セル間をJLabelを置くことはできません)これらの最初を解決し、

  • +1

    heheheは両方の答えを一緒に入れて、今すぐ貴重な答えになります。+1 – mKorbel

    +0

    @mKorbel確かに。我々は両方のポイントを逃した(またはアップホールドを共有するためにそれを残した)ようです。あなたの答えは+1 – Robin

    +0

    @Robinコードは、私が実際に使っているテーブルとサンプルのミックスで、ベッドに出る前にそれをやっていました。本当に疲れていて、実装されていないメソッドについては気にしませんでした。最初のポイントは絶対に正しいと私を解決に導く。レンダラーの列インデックスをチェックして、Stringの代わりにJLabelを返します。ありがとう! +1と正解: – AlejandroVK

    4

    1を何が起こるかを見ます

    3)あなたのAbstractTableModelはあなたがObject[][]/Object[]Modelのための宣言間違いがありますが、あなたのC Vector<String>Vector<Vector<Object>>/Object[]Object[][]を変更することで、Vectorに基づいています削除この問題

    4)AbstractTableModelを使用しない、使用JXTreeTableが、私は列0を設定する場合は、あなたがDefaultTableModel

    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

    +0

    ありがとう!カミコロ –

    関連する問題