Java JTable-Boolean.class单元渲染器和Nimbus外观的问题
我正在使用JTable可视化一些数据。一列指定通过复选框显示布尔数据。我通过从表模型中重写的getColumnClass()函数返回Boolean.class实现了这一点 不幸的是,这会导致单元格带有复选框,但没有适合当前行的背景色 我用这篇文章的答案解决了这个问题: 现在我试图增加交替行的对比度。我通过设置我正在使用的Nimbus LAF的适当属性来实现这一点Java JTable-Boolean.class单元渲染器和Nimbus外观的问题,java,swing,jtable,ubuntu-12.04,nimbus,Java,Swing,Jtable,Ubuntu 12.04,Nimbus,我正在使用JTable可视化一些数据。一列指定通过复选框显示布尔数据。我通过从表模型中重写的getColumnClass()函数返回Boolean.class实现了这一点 不幸的是,这会导致单元格带有复选框,但没有适合当前行的背景色 我用这篇文章的答案解决了这个问题: 现在我试图增加交替行的对比度。我通过设置我正在使用的Nimbus LAF的适当属性来实现这一点 UIDefaults defaults = UIManager.getLookAndFeelDefaults(); default
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
defaults.put("Table.alternateRowColor", new Color(217, 217, 217));
如您所见,布尔单元格的背景仍然是旧的Nimbus表。AlternaterRowcolor
颜色
有没有办法改变这一点?我这样做完全错了吗?有没有更好的方法来实现背景色和对比度的交替
编辑
引起
java版本“1.7.0_17”java(TM)SE运行时环境(构建
Java热点(TM)服务器虚拟机(构建23.7-b01,混合模式),操作系统是Ubuntu 12.04
- 我将使用标准渲染器概念来完成这项工作,而不是使用Nimbus常量
- 渲染器适用于Nimbus,覆盖所有颜色,不包括JTableHeader
- 基于@camickrs的代码
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.UIResource;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
public class TestTable10 {
public static void main(String[] args) {
new TestTable10();
}
public TestTable10() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
UIManager.getLookAndFeelDefaults().put("Table.alternateRowColor", Color.RED);
JTable table = new JTable(new MyModel());
((JComponent) table.getDefaultRenderer(Boolean.class)).setOpaque(true);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MyModel extends AbstractTableModel {
@Override
public int getRowCount() {
return 10;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return "Hello";
case 1:
return true;
}
return "?";
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return columnIndex == 0 ? String.class : Boolean.class;
}
}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.EventQueue;
导入javax.swing.JCheckBox;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.border;
导入javax.swing.border.EmptyBorder;
导入javax.swing.plaf.UIResource;
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.TableCellRenderer;
公共类测试表10{
公共静态void main(字符串[]args){
新的TestTable10();
}
公共测试表10(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(“com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel”);
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
UIManager.getLookAndFeelDefaults().put(“Table.alternatiorwcolor”,Color.RED);
JTable table=newjtable(newmymodel());
((JComponent)table.getDefaultRenderer(Boolean.class)).set不透明(true);
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(新的JScrollPane(表));
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类MyModel扩展了AbstractTableModel{
@凌驾
public int getRowCount(){
返回10;
}
@凌驾
public int getColumnCount(){
返回2;
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
开关(列索引){
案例0:
回复“你好”;
案例1:
返回true;
}
返回“?”;
}
@凌驾
公共类getColumnClass(int columnIndex){
return columnIndex==0?String.class:Boolean.class;
}
}
}
为了解决这个问题,我使用了jxtable()而不是jtable(),并且我使用了自己的prepareRenderer来处理行颜色(您可以使用mKorbel的prepareRenderer,将其放入netbeans中的表中,只需为jxtable()组件自定义代码),因为这个解决方案:对我来说不适用于多色行。我的平台:Windows 7 32位,java版本“1.7.0_21”,
Java(TM)SE运行时环境(build 1.7.0_21-b11),
Java热点(TM)客户端虚拟机(构建23.21-b01,混合模式,共享),netbeans IDE 7.3
以下是png(没有足够的声誉:D):。设置Nimbus L&F后,立即添加以下行:
UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", Color.DARK_GRAY);
UIManager.getLookAndFeelDefaults().put("Table.background",new ColorUIResource(Color.DARK_GRAY));
UIManager.getLookAndFeelDefaults().put("Table.alternateRowColor",Color.DARK_GRAY.brighter());
请注意Table.background的ColorUIResource用法。
这为我解决了复选框背景问题。+1好问题,好问题,对于未来的读者来说可能是一个非常好的问题,如果你将发布一个简短、可运行、可编译的感谢,看起来不错。不幸的是,我在这里使用的是Netbeans平台,所以“在更改任何内容之前”可能很难确定。我目前正在尝试使用一个模块安装程序在启动时执行此操作,并查看其运行情况。我也在尝试@mKorbel-answer,因为它与LAF无关。很好的解决方案。我承认最好改变L&F级别的外观,而不是像其他答案所建议的那样硬编码。@AdamDyga我看到很多人直接跳起来更新
JTable
,出于很多原因,我个人对此有一个问题,因为它将解决方案与扩展紧密结合在一起。如果你能找到让代码保持可移植性的方法,那么这一定是值得付出的努力,IMHOAt首先,这看起来很棒。但是我没有得到和你一样的结果。我的Boolean.class列看起来仍然不像其他列。不幸的是,我没有一个我可以发布在这里,但我正在努力。编辑:很奇怪。我将您的代码复制到一个新类中,但仍然得到了一个不同的类。所有内容都隐藏在渲染器中,有一些…,请确保您将布尔值(真/假)设置为JTable not JCheckBox,也没有关于JCheckBox的内容,然后您运气不佳,需要覆盖所有键
UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", Color.DARK_GRAY);
UIManager.getLookAndFeelDefaults().put("Table.background",new ColorUIResource(Color.DARK_GRAY));
UIManager.getLookAndFeelDefaults().put("Table.alternateRowColor",Color.DARK_GRAY.brighter());