Eu estou tentando definir a cor da linha de um Swing Jtable. Eu uso essa class para estender o Jtable como sugestão na net.
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); } }
Eu simplesmente adicionei o método resetColor (Color colour) para inicializar toda a linha com a mesma cor.
Costuma trabalhar no primeiro uso, mas quando eu quero mudar as colors eu recebo problemas. por exemplo, se eu executar o código seguinte dentro de um ouvinte de ação do botão eu colorir a tabela corretamente apenas na primeira iteração e depois nunca mude o fundo.
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();
Alguém tem alguma idéia sobre o que poderia ser?
Obrigado, Ste
por exemplo,
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 tbl = new Vector (); Vector
Pode soar comigo mesmo respondendo a uma das minhas perguntas. mas eu encontrei outro conserto no meu bug. mas não tenho muita certeza sobre o motivo. Eu chamo um epaint pouco antes da validação e tudo funciona bem:
deployTable.repaint(); deployTable.revalidate();
Eu acho que não tenho realmente claro a diferença dentro de repintar e revalidar. Alguém pode explicar isso para mim?