2011-08-01 22 views
2

Swing Jtableの行の色を設定しようとしています。 私はこのクラスを使用してネット上の提案としてJtableを拡張します。jtableの行の背景色をリフレッシュ

public class ColorTable extends JTable { 


    private static final long serialVersionUID = 1L; 
    private Map rowColor = new HashMap(); 
    private Map columnColor = new HashMap(); 
    private Color cellColor; 
    private Color defaultColor; 

    public ColorTable(TableModel model) { 
     super(model); 
    } 

    public void setRowColor(int row, Color c) { 
     rowColor.put(new Integer(row), c); 
    } 

    public void setColumnColor(int column, Color c) { 
     columnColor.put(new Integer(column), c); 
    } 

    public void setCellColor(Color c) { 
     cellColor = c; 
    } 

    public Class getColumnClass(int column) { 
     return getValueAt(0, column).getClass(); 
    } 

    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 

     Component c = super.prepareRenderer(renderer, row, column); 
     if (defaultColor == null) 
      defaultColor = c.getBackground(); 

     // Color order is as follows: 
     // rowSelection, checkBox toggle for row color, column color, cell color 
     if (! isRowSelected(row)) { 
      Color color = (Color) rowColor.get(new Integer(row)); 
      if (color == null || Boolean.FALSE.equals(getModel().getValueAt(row, 0))) 
       color = (Color) columnColor.get(new Integer(column)); 
      if (color == null) { 
       // cell color only if cell has special value, for example purposes, 
       // if the cell value begins with a 2 
       Object value = getValueAt(row, column); 
       if (value != null && value.toString().startsWith("2")) 
        color = cellColor; 
      } 
      if (color != null) 
       c.setBackground(color); 
      else 
       c.setBackground(defaultColor); 
     } 
     return c; 
    } 

    public void resetColor(Color color) { 
     for(int i=0;i<this.getRowCount();i++) 
      this.setRowColor(i, color); 
    } 
} 

同じ色のすべての行を初期化するために、単にresetColor(Color color)メソッドを追加しました。

最初の使用では縫い目がありますが、色を変更したいときに問題が発生します。たとえば、ボタンアクションリスナー内でソルバインコードを実行すると、最初の繰り返しでテーブルを適切に色付けした後、バックグラウンドを変更しないでください。

deployTable.resetColor(Color.green); 
// set red background to the 
for (Integer x : indexes) { 
    System.out.println("index "+x+" red!"); 
    deployTable.setRowColor(x, Color.red); 
} 
deployTable.revalidate(); 

誰でも何ができるか考えていますか?それは自分自身が私の質問のいずれかに答える有線音も

おかげで、 サント

+1

'repaint()'は表示されません。 – trashgod

答えて

8

例えば、

enter image description hereenter image description here

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import java.util.Vector; 
import javax.swing.*; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 
import javax.swing.event.TableModelEvent; 
import javax.swing.event.TableModelListener; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableCellRenderer; 

public class Forum implements ListSelectionListener { 

    private JFrame frame = new JFrame("Frame"); 
    private JPanel fatherCenter = new JPanel(); 
    private JScrollPane tableScroll = new JScrollPane(); 
    private myTableModel tableModel; 
    private JTable dialogTable; 
    private JButton blueButton; 
    private ListSelectionModel lsDialog; 
    private Color clr; 
    private Color clr1; 

    private void addComponentsToPane(Container pane) { 
     tableModel = new myTableModel(); 
     dialogTable = new JTable(tableModel) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component comp = super.prepareRenderer(renderer, row, column); 
       JComponent jc = (JComponent) comp;//for Custom JComponent 
       if (!isRowSelected(row)) { 
        int modelRow = convertRowIndexToModel(row); 
        boolean type = (Boolean) getModel().getValueAt(modelRow, 2); 
        boolean type1 = (Boolean) getModel().getValueAt(modelRow, 3); 
        comp.setForeground(Color.black); 
        if ((type) && (!type1)) { 
         comp.setBackground(clr1); 
        } else if ((!type) && (type1)) { 
         comp.setBackground(Color.orange); 
        } else if ((!type) || (!type1)) { 
         comp.setBackground(Color.red); 
        } else { 
         comp.setBackground(row % 2 == 0 ? getBackground() : getBackground().darker()); 
        } 
        dialogTable.convertRowIndexToView(0); 
       } else { 
        comp.setForeground(Color.blue); 
       } 
       if (!isCellEditable(row, column)) { 
        comp.setForeground(Color.red); 
        comp.setBackground(Color.magenta); 
       } 
       return comp; 
      } 
     }; 
     tableScroll = new JScrollPane(dialogTable, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
       ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     tableScroll.setBorder(null); 
     dialogTable.getTableHeader().setReorderingAllowed(false); 
     dialogTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     lsDialog = dialogTable.getSelectionModel(); 
     dialogTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 
     dialogTable.setRowHeight(20); 
     dialogTable.setRowMargin(2); 
     ListSelectionModel rowSelMod = dialogTable.getSelectionModel(); 
     //ListSelectionModel colSelMod = dialogTable.getColumnModel().getSelectionModel(); 
     rowSelMod.addListSelectionListener(this); 
     //colSelMod.addListSelectionListener(this); 
     blueButton = new JButton(" Blue BackGround "); 
     blueButton.setPreferredSize(new Dimension(100, 30)); 
     blueButton.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       if (clr == Color.white) { 
        clr = Color.orange; 
        clr1 = Color.yellow; 
       } else { 
        clr = Color.white; 
        clr1 = Color.black; 
       } 
       System.out.println(clr); 
       dialogTable.setBackground(clr); 
       dialogTable.repaint(); 
      } 
     }); 
     fatherCenter = new JPanel(); 
     fatherCenter.setLayout(new BorderLayout(10, 10)); 
     fatherCenter.add(tableScroll, BorderLayout.CENTER); 
     fatherCenter.add(blueButton, BorderLayout.SOUTH); 
     pane.add(fatherCenter); 
    } 

    private void addData() { 
     Runnable doRun1 = new Runnable() { 

      @Override 
      public void run() { 
       tableModel.resetTable(); 
       Vector<String> tbl = new Vector<String>(); 
       Vector<Object> tbl1 = new Vector<Object>(); 
       Random rnd = new Random(); 
       tbl.add("Integer"); 
       tbl.add("Double"); 
       tbl.add("Boolean"); 
       tbl.add("Boolean"); 
       tbl.add("String"); 
       tableModel.setColumnNames(tbl); 
       for (int row = 0; row < 30; row++) { 
        tbl1 = null; 
        tbl1 = new Vector<Object>(); 
        tbl1.addElement(row + 1); 
        tbl1.addElement(rnd.nextInt(25) + 3.14); 
        tbl1.addElement((row % 3 == 0) ? false : true); 
        tbl1.addElement((row % 5 == 0) ? false : true); 
        if (row % 7 == 0) { 
         tbl1.add(("Canc")); 
        } else if (row % 6 == 0) { 
         tbl1.add(("Del")); 
        } else { 
         tbl1.add(("New")); 
        } 
        tableModel.addRow(tbl1); 
       } 
       addTableListener(); 
      } 
     }; 
     SwingUtilities.invokeLater(doRun1); 
    } 

    private void addTableListener() { 
     tableModel.addTableModelListener(new TableModelListener() { 

      @Override 
      public void tableChanged(TableModelEvent tme) { 
       if (tme.getType() == TableModelEvent.UPDATE) { 
        System.out.println(""); 
        System.out.println("Cell " + tme.getFirstRow() + ", " 
          + tme.getColumn() + " changed. The new value: " 
          + tableModel.getValueAt(tme.getFirstRow(), 
          tme.getColumn())); 
       } 
      } 
     }); 
    } 

    public void valueChanged(ListSelectionEvent le) { 
     int row = dialogTable.getSelectedRow(); 
     int col = dialogTable.getSelectedColumn(); 
     String str = "Selected Row(s): "; 
     int[] rows = dialogTable.getSelectedRows(); 
     for (int i = 0; i < rows.length; i++) { 
      str += rows[i] + " "; 
     } 
     str += "Selected Column(s): "; 
     int[] cols = dialogTable.getSelectedColumns(); 
     for (int i = 0; i < cols.length; i++) { 
      str += cols[i] + " "; 
     } 
     str += "Selected Cell: " + dialogTable.getSelectedRow() + ", " + dialogTable.getSelectedColumn(); 
     System.out.println(str); 
     Object value = dialogTable.getValueAt(row, col); 
     System.out.println(String.valueOf(value)); 
    } 

    private void createAndShowGUI() { 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout(10, 10)); 
     addComponentsToPane(frame.getContentPane()); 
     addData(); 
     frame.setLocation(150, 150); 
     frame.setPreferredSize(new Dimension(400, 647)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     Forum osFrame = new Forum(); 
    } 

    public Forum() { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private class myTableModel extends AbstractTableModel { 

     private static final long serialVersionUID = 1L; 
     private Vector<Vector<Object>> data; 
     private Vector<String> colNames; 
     private boolean[] _columnsVisible = {true, true, true, true, true}; 

     myTableModel() { 
      this.colNames = new Vector<String>(); 
      this.data = new Vector<Vector<Object>>(); 
     } 

     myTableModel(Vector<String> colnames) { 
      this.colNames = colnames; 
      this.data = new Vector<Vector<Object>>(); 
     } 

     public void resetTable() { 
      this.colNames.removeAllElements(); 
      this.data.removeAllElements(); 
     } 

     public void setColumnNames(Vector<String> colNames) { 
      this.colNames = colNames; 
      this.fireTableStructureChanged(); 
     } 

     public void addRow(Vector<Object> data) { 
      this.data.add(data); 
      //this.fireTableDataChanged(); 
      //this.fireTableStructureChanged(); 
      this.fireTableRowsInserted(data.size() - 1, data.size() - 1); 
     } 

     public void removeRowAt(int row) { 
      this.data.removeElementAt(row); 
      //this.fireTableDataChanged(); 
      this.fireTableRowsDeleted(row - 1, data.size() - 1); 
     } 

     @Override 
     public int getColumnCount() { 
      return this.colNames.size(); 
     } 

     @Override 
     public Class<?> getColumnClass(int colNum) { 
      switch (colNum) { 
       case 0: 
        return Integer.class; 
       case 1: 
        return Double.class; 
       case 2: 
        return Boolean.class; 
       case 3: 
        return Boolean.class; 
       default: 
        return String.class; 
      } 
     } 

     @Override 
     public boolean isCellEditable(int row, int colNum) { 
      switch (colNum) { 
       case 2: 
        return false; 
       default: 
        return true; 
      } 
     } 

     @Override 
     public String getColumnName(int colNum) { 
      return this.colNames.get(colNum); 
     } 

     @Override 
     public int getRowCount() { 
      return this.data.size(); 
     } 

     @Override 
     public Object getValueAt(int row, int col) { 
      Vector<Object> value = this.data.get(row); 
      return value.get(col); 
     } 

     @Override 
     public void setValueAt(Object newVal, int row, int col) { 
      Vector<Object> aRow = data.elementAt(row); 
      aRow.remove(col); 
      aRow.insertElementAt(newVal, col); 
      fireTableCellUpdated(row, col); 
     } 

     public void setColumnVisible(int index, boolean visible) { 
      this._columnsVisible[index] = visible; 
      this.fireTableStructureChanged(); 
     } 
    } 
} 
+0

+1これで 'repaint()'が表示されます。 – trashgod

+1

カスタムTableModelコードは、addRow、removeRowAtメソッドが誤ったイベントを発生させるため、最適ではありません。それぞれfireTableRowInsertedとfireTableRowsDeletedを使用する必要があります。これは、テーブルの影響を受けた行だけが再描画されるため、最も効率的です。 fireTableStructureChangedは、すべてのTableColumnとともにTableColumnModelを再作成するため、高価です。これは、テーブルにカスタムレンダラまたはエディタを追加した場合に問題になる可能性があります。 – camickr

+0

@camickrは、非常に貴重なコミットメント、バンプありがとうございました... - >それはおそらく 'prepareEditor()'の実装に関する私の問題ですが、それは別の話です - 、私は私のポストを修正します – mKorbel

0

。私のバグには別のクック修正がありました。理由は分かりません。私は検証する前にepaintを呼び出して、すべてが正常に動作します:

deployTable.repaint(); 
deployTable.revalidate(); 

私は私は本当に再描画内の違いをクリアして再検証していないと思います。誰も私にそれを説明することはできますか?