-
можно правильно обновить фон на основе значения извне, без принуждения для перерисовки
table.repaint();
-
действителен для Java6/7, поскольку никаких изменений в API не было.
мой SSCCE работает правильно, перекрашенный JTable.repaint()
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class MyTableAndRenderer {
private JFrame frame = new JFrame();
private JPanel panel = new JPanel();
private String[] items = {"Item 1", "Item 2", "Item 3", "Item 4"};
private DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(items);
private JComboBox combo = new JComboBox(comboBoxModel);
private JPanel panel1 = new JPanel();
private String[] columnNames = {"First Name", "Last Name", "Sport",
"# of Years", "Vegetarian"};
private Object[][] data = {
{"Kathy", "Smith", "Item 1", new Integer(5), (false)},
{"John", "Doe", "Item 1", new Integer(3), (true)},
{"Sue", "Black", "Item 3", new Integer(2), (false)},
{"Jane", "White", "Item 3", new Integer(20), (true)},
{"Joe", "Brown", "Item 3", new Integer(10), (false)}
};
private DefaultTableModel model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
private JTable table = new JTable(model);
public MyTableAndRenderer() {
panel.setBorder(new EmptyBorder(10, 0, 2, 0));
panel.add(combo);
//@HFOE
/*table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
String str = combo.getSelectedItem().toString();
if (value.toString().equalsIgnoreCase(str)) {
setBackground(Color.RED);
} else {
setBackground(null);
}
return this;
}
});*/
//@kleopatra
/*table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
String str = combo.getSelectedItem().toString();
if (value.toString().equalsIgnoreCase(str)) {
setBackground(Color.RED);
} else {
setBackground(null);
}
super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
return this;
}
});*/
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
String str = combo.getSelectedItem().toString();
if (value.toString().equalsIgnoreCase(str)) {
setBackground(Color.RED);
table.repaint();
} else {
setBackground(null);
table.repaint();
}
return this;
}
});
table.getTableHeader().setReorderingAllowed(false);
table.setAutoCreateRowSorter(true);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
panel1.setLayout(new GridLayout(1, 1, 10, 10));
panel1.add(new JScrollPane(table));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel, BorderLayout.NORTH);
frame.add(panel1);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MyTableAndRenderer fs = new MyTableAndRenderer();
}
});
}
}
ИЗМЕНИТЬ
@Devolus написал. Вы проверили, что я разместил? Я взял этот фрагмент из своего собственного рабочего кода, я просто удалил материал между ними, поскольку он не имеет отношения к ответу. Я использую Java 6 здесь, и это работает для меня.
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row, int column)
{
Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
... determine the color value ...
cell.setBackground(back);
cell.setForeground(fore);
}
- вызывается
- не имеет значения Java6/7
из кода (причина для публикации SSCCE)
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class MyTableAndRenderer {
private JFrame frame = new JFrame();
private JPanel panel = new JPanel();
private String[] items = {"Item 1", "Item 2", "Item 3", "Item 4"};
private DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(items);
private JComboBox combo = new JComboBox(comboBoxModel);
private JPanel panel1 = new JPanel();
private String[] columnNames = {"First Name", "Last Name", "Sport",
"# of Years", "Vegetarian"};
private Object[][] data = {
{"Kathy", "Smith", "Item 1", new Integer(5), (false)},
{"John", "Doe", "Item 1", new Integer(3), (true)},
{"Sue", "Black", "Item 3", new Integer(2), (false)},
{"Jane", "White", "Item 3", new Integer(20), (true)},
{"Joe", "Brown", "Item 3", new Integer(10), (false)}
};
private DefaultTableModel model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
private JTable table = new JTable(model);
public MyTableAndRenderer() {
panel.setBorder(new EmptyBorder(10, 0, 2, 0));
panel.add(combo);
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
Component c = super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
String str = combo.getSelectedItem().toString();
if (value.toString().equalsIgnoreCase(str)) {
c.setBackground(Color.RED);
} else {
c.setBackground(null);
}
return this;
}
});
table.getTableHeader().setReorderingAllowed(false);
table.setAutoCreateRowSorter(true);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
panel1.setLayout(new GridLayout(1, 1, 10, 10));
panel1.add(new JScrollPane(table));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel, BorderLayout.NORTH);
frame.add(panel1);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MyTableAndRenderer fs = new MyTableAndRenderer();
}
});
}
}
EDIT2
- от WinXp (для всех Win OS не использовать Nimbus, Renderer там очень смешно, никогда не видел этого, отлично!!! как это возможно)
EDIT3:
note Я упрощённый код, насколько это возможно, проверен перед моим вопросом здесь, тогда листинг компонента Rendering в JComponent/JLabel тоже не работает (с JLabel.repaint()/setOpaque())