-
Bug
-
Resolution: Unresolved
-
P4
-
None
-
6u10
-
x86
-
windows_vista
FULL PRODUCT VERSION :
java version "1.6.0_10-beta"
Java(TM) SE Runtime Environment (build 1.6.0_10-beta-b25)
Java HotSpot(TM) Client VM (build 11.0-b12, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
6.0.6001
A DESCRIPTION OF THE PROBLEM :
The cell background is invalid, when I want to display a JCheckBox or JComboBox in a JTable:
JCheckBox centeredCheckBox = new JCheckBox();
centeredCheckBox.setHorizontalAlignment(SwingConstants.CENTER);
myTable.getTableHeader().getColumnModel().getColumn(0).setCellEditor(
new DefaultCellEditor(centeredCheckBox));
myTable.getTableHeader().getColumnModel().getColumn(0).setCellRenderer(
new CheckBoxCellRenderer());
The CheckBoxCellRenderer is defined as follows:
public class CheckBoxCellRenderer extends JCheckBox implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setOpaque(true);
if (isSelected) {
setBackground(table.getSelectionBackground());
} else {
setBackground(table.getBackground());
}
this.setHorizontalAlignment(SwingConstants.CENTER);
setSelected((Boolean) value);
return this;
}
}
First, setting opaque to false makes the background ALWAYS white and ignores the current selection - just as if the JTable forgot to paint the background there.
However, the table.getBackground() seems to return invalid values - I would expect it to return the color of the currently rendered row, and it does not - it returns sometimes dark gray, which isn't any of the background colors of the nimbus L&F. This causes I cannot write a universal CellRenderer that works good for all L&Fs.
As a workaround I hardcoded the 2 Nimbus background colors in the renderer, but I'm not happy with this solution.
The problem doesn't exist in the MetalLookAndFeel, regardless opaque is set or not.
REPRODUCIBILITY :
This bug can be reproduced always.
CUSTOMER SUBMITTED WORKAROUND :
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setOpaque(true);
if (isSelected) {
setBackground(table.getSelectionBackground());
} else {
if (row % 2 == 1)
setBackground(Color.WHITE);
else
setBackground(table.getBackground());
}
//...
}
java version "1.6.0_10-beta"
Java(TM) SE Runtime Environment (build 1.6.0_10-beta-b25)
Java HotSpot(TM) Client VM (build 11.0-b12, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
6.0.6001
A DESCRIPTION OF THE PROBLEM :
The cell background is invalid, when I want to display a JCheckBox or JComboBox in a JTable:
JCheckBox centeredCheckBox = new JCheckBox();
centeredCheckBox.setHorizontalAlignment(SwingConstants.CENTER);
myTable.getTableHeader().getColumnModel().getColumn(0).setCellEditor(
new DefaultCellEditor(centeredCheckBox));
myTable.getTableHeader().getColumnModel().getColumn(0).setCellRenderer(
new CheckBoxCellRenderer());
The CheckBoxCellRenderer is defined as follows:
public class CheckBoxCellRenderer extends JCheckBox implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setOpaque(true);
if (isSelected) {
setBackground(table.getSelectionBackground());
} else {
setBackground(table.getBackground());
}
this.setHorizontalAlignment(SwingConstants.CENTER);
setSelected((Boolean) value);
return this;
}
}
First, setting opaque to false makes the background ALWAYS white and ignores the current selection - just as if the JTable forgot to paint the background there.
However, the table.getBackground() seems to return invalid values - I would expect it to return the color of the currently rendered row, and it does not - it returns sometimes dark gray, which isn't any of the background colors of the nimbus L&F. This causes I cannot write a universal CellRenderer that works good for all L&Fs.
As a workaround I hardcoded the 2 Nimbus background colors in the renderer, but I'm not happy with this solution.
The problem doesn't exist in the MetalLookAndFeel, regardless opaque is set or not.
REPRODUCIBILITY :
This bug can be reproduced always.
CUSTOMER SUBMITTED WORKAROUND :
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setOpaque(true);
if (isSelected) {
setBackground(table.getSelectionBackground());
} else {
if (row % 2 == 1)
setBackground(Color.WHITE);
else
setBackground(table.getBackground());
}
//...
}