Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable-Boolean.class单元渲染器和Nimbus外观的问题_Java_Swing_Jtable_Ubuntu 12.04_Nimbus - Fatal编程技术网

Java JTable-Boolean.class单元渲染器和Nimbus外观的问题

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

我正在使用JTable可视化一些数据。一列指定通过复选框显示布尔数据。我通过从表模型中重写的getColumnClass()函数返回Boolean.class实现了这一点

不幸的是,这会导致单元格带有复选框,但没有适合当前行的背景色

我用这篇文章的答案解决了这个问题:

现在我试图增加交替行的对比度。我通过设置我正在使用的Nimbus LAF的适当属性来实现这一点

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());