Nimbus风格下Swing JTable布尔单元格背景色设置异常问题
JTable布尔单元格背景色在Nimbus Look&Feel下的统一问题
问题场景
在NetBeans 15、Sun JDK 19.0.1环境下开发Swing GUI,尝试为JTable行设置自定义背景色时,发现布尔类型单元格的背景无法与其他单元格保持一致。
已尝试方案
- 自定义
TableCellRenderer,设置背景色为红色,但布尔单元格显示白色;开启setOpaque(true)后,布尔单元格呈现交替背景色。 - 重写JTable的
prepareRenderer方法,出现完全相同的现象。
进一步观察
- Nimbus Look&Feel会自动启用交替行颜色,修改UIManager的
Table.alternateRowColor属性为绿色后,布尔单元格背景变为交替绿色。 - 移除Nimbus可以解决该问题,但会导致UI样式过时。
- 选中行时,布尔单元格能正常显示正确的背景色。
- 查阅
setBackground()文档发现,部分Look&Feel可能会忽略该属性。目前结论:无论如何配置,仅能修改非交替行的布尔单元格背景,选中行除外。
疑问
- 是否遗漏了关键的配置步骤?
- 能否禁用Nimbus的交替行颜色功能?
- 这是否是Nimbus Look&Feel的已知问题?
SSCCE代码
package tabletest; import java.awt.Color; import java.awt.Component; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; public class NewJFrame extends javax.swing.JFrame { public NewJFrame() { initComponents(); // attempt #1 /* jTable1.setDefaultRenderer(Boolean.class, new MyTableRenderer(jTable1.getDefaultRenderer(Boolean.class)));; jTable1.setDefaultRenderer(String.class, new MyTableRenderer(jTable1.getDefaultRenderer(String.class)));; */ } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); jTable1 = new javax.swing.JTable() { //attempt #2 @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); //((JComponent)c).setOpaque(true); c.setBackground(Color.red); return c; } } ; setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jTable1.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { { new Boolean(true), new Integer(1), new Float(0.1), "asd"}, { new Boolean(true), new Integer(2), new Float(0.2), "lol"}, {null, new Integer(3), new Float(0.3), "xd"}, {null, new Integer(4), new Float(0.4), "ftw"}, {null, new Integer(5), new Float(0.5), "wtf"} }, new String [] { "bool", "int", "float", "string" } ) { Class[] types = new Class [] { java.lang.Boolean.class, java.lang.Integer.class, java.lang.Float.class, java.lang.String.class }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } }); jScrollPane1.setViewportView(jTable1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(59, 59, 59) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(174, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(25, 25, 25) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(100, Short.MAX_VALUE)) ); pack(); }// </editor-fold> public static void main(String args[]) { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } //</editor-fold> /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new NewJFrame().setVisible(true); } }); } //attempt #1 class MyTableRenderer implements TableCellRenderer { private final TableCellRenderer renderer; public MyTableRenderer(TableCellRenderer renderer) { this.renderer = renderer; } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); //c.setOpaque(true); c.setBackground(Color.red); return c; } } // Variables declaration - do not modify private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable jTable1; // End of variables declaration }
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

