2011-11-15 7 views
3

私はテーブルモデルでは、このコードを持っている:JTableの行の色はモデルのValueによって異なりますか?

public class DocumentProjectTableModel extends AbstractTableModel{ 

    private List<MyDocument> myDocuments; 
    public String getValueAt(int row, int column) { 
      String toReturn = null; 
      MyDocument myDocument = myDocuments.get(row); 
      SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy"); 

      switch (column) { 
       case 0: 
        if(myDocument.getProject().getRegDate()!=null) toReturn = format.format(myDocument.getProject().getRegDate()); 
        break; 
       case 1: 
        toReturn = myDocument.getProject().getRegNum(); 
        break; 
       case 2: 
        toReturn = myDocument.getProject().getDescription(); 
        break; 
       case 3: 
        toReturn = myDocument.getProject().getShortName(); 
        break; 
       case 4: 
        toReturn = myDocument.getProject().getSecondName()+myDocument.getProject().getFirstName()+myDocument.getProject().getMiddleName(); 
        break; 

      } 
      return toReturn; 
     } 
// some other stuff is not shown 

Iは、例えば、それぞれの行の背景色を変更したいmyDocument.getIsValid == false行がように青色であり、場合myDocument.getIsRegistered() == trueは、私は、この行は、黄色の背景を持っている場合は。

私は、JTableの値に応じて行を再描画する例が見つかりました。しかし、getIsValidとgetIsRegistered()は実際には表示されません。モデルにのみ存在します。アドバイスや例が本当に助けになります。前もって感謝します。

更新。私TableCellRendererを:

public class MyTableCellRenderer extends JLabel implements TableCellRenderer { 

    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { 
     String actualValue = (String) value; 
     // Set the colors as per the value in the cell... 
     if(actualValue.equals("lifesucks")){ 
      setBackground(Color.YELLOW); 
     } 
     return this; 
    } 
} 

使用してレンダラ:

  int vColIndex = 0; 
      TableColumn col = resultTable.getColumnModel().getColumn(vColIndex); 
      col.setCellRenderer(new MyTableCellRenderer()); 
resultTable.setModel(new DocumentProjectTableModel(docs)); 

テーブルは通常の無黄色で示されています。どうして?

update2。

resultTable=new JTable(new DocumentProjectTableModel(docs)){ 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) 
      { 
       Component c = super.prepareRenderer(renderer, row, column); 
       // Color row based on a cell value 
       if (!isRowSelected(row)) { 
        c.setBackground(getBackground()); 
        int modelRow = convertRowIndexToModel(row); 
        String type = (String) getModel().getValueAt(modelRow, 0); 

         c.setBackground(Color.GREEN); 
       } 
       return c; 
      } 
     }; 

テーブルは空です:(

+1

レンダラーが使用されていない可能性があります。これは、列単位で設定され、モデルを設定します。 defaulによって、列はsetModel上に再作成されます(または、structureChangedを受け取る)ので、すべての設定を失います – kleopatra

+0

指摘していただきありがとうございます。しかし、私はレンダラーを呼び出しますか? – bunnyjesse112

答えて

5

行全体を色付けしたいので、より簡単にTable Row Renderingを使用すると、muulipleカスタムレンダラーを作成するよりも簡単です。

JTableの値に応じて行を色分けする例があります。しかし、getIsValidとgetIsRegistered()は実際には表示されません。モデルにのみ存在します

テーブルからモデルにアクセスすることはできます。

table.getModel().getValueAt(...); 
+1

すべてのセルと行に常に同じレンダラーを使用できます。行番号と列番号を指定したレンダラーとJTableの背後にあるモデルを使用して、セルまたは行全体をレンダリングする方法を理解することができます。 – GETah

+2

@ GETah、すべての行/列に同じレンダラーを使用することは、列にさまざまなタイプのデータが含まれている場合はお勧めできません。テーブルには、すでに各列にどのレンダラーを使用するかを決定するコードがあります。カスタムレンダラでコードを複製しないでください。 – camickr

+1

@ GETah - 可能な限り普通の設定 – kleopatra

1

あなたがあなた自身のセルレンダリングを記述する必要があります。

http://www.exampledepot.com/egs/javax.swing.table/CustRend.html

+0

回答ありがとうございます。しかし、あなたが提供したリンクは、Jtableからの価値に応じて色を変えることを説明しています。表示されないモデルからの値に応じて色が変わる必要があります。あなたは例を挙げることができますか?ありがとう – bunnyjesse112

+1

実際に値がモデルから取得されます。モデルをJTableにバインドしてください。 JTableは値を取得しますので、それを気にする必要はありません。 – GETah

+1

JTableのconvertRowIndexToModel()を使用して、行のモデルインデックスを取得できます。モデルインデックスを使用して、テーブルモデルに関連するデータを照会し、色を決定することができます。 –

1

あなたはカスタムセルレンダラーを実装する必要がここで良いスタートです。 編集:コード更新

public class MyCellRenderer extends JLabel implements TableCellRenderer { 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { 
     DocumentProjectTableModel mymodel = (DocumentProjectTableMode) table.getModel(); 
     MyDocument actualValue = (MyDocument) mydocumentModel.getDocument(rowIndex) ; 
     // Set the colors as per the value in the cell... 
     if(myDocument.getIsRegistered() == ...){ 
      setBackground(Color.YELLOW); 
     }// and so on...   
     return this; 
    } 
} 

この方法ですべての列のレンダラーを設定します。

resultTable.setDefaultRenderer(MyColumnType.class, new MyCellRenderer()); 

これが役立ちます。

+0

更新された質問を見てください。ありがとう – bunnyjesse112

+1

ちょうど私の答えを編集してくださいそれを見て、私に結果を知らせてください – GETah

+1

テーブルがソートされている場合、間違った行を強調表示されます – kleopatra

関連する問題