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

标签 java swing jtable ubuntu-12.04 nimbus

我正在使用 JTable 来可视化一些数据。一栏注定要通过复选框显示 boolean 数据。我通过从表模型中覆盖的 getColumnClass() 函数返回 Boolean.class 来实现这一点。

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

Original

我使用这篇文章的答案解决了这个问题:JTable - Boolean Cell Type - Background

Boolean.class fix

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

UIDefaults defaults = UIManager.getLookAndFeelDefaults();
defaults.put("Table.alternateRowColor", new Color(217, 217, 217));

With set Nimbus property

如您所见, boolean 单元格的背景仍然是旧的 Nimbus Table.alternateRowColor 颜色。

有办法改变吗?我这样做完全错了吗?有没有更好的方法来实现交替的背景颜色和更大的对比度?

编辑

引起

java version "1.7.0_17" Java(TM) SE Runtime Environment (build 1.7.0_17-b02) Java HotSpot(TM) Server VM (build 23.7-b01, mixed mode), OS is Ubuntu 12.04

最佳答案

我(终于)能够让它工作了。秘诀是在创建任何内容之前更改默认值。

enter image description here

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 - JTable - Boolean.class 单元格渲染器和 Nimbus 外观的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16054330/

相关文章:

java - 第二个 JOptionPane.showInputDialog 未打开

java - JTable (BeanTableModel) 不更新/刷新 - Java Swing

java - 有没有办法改变javafx中tableview中一行的样式?

java - Glassfish 应用程序日志记录的常见模式有哪些?

java - 服装组件错误 "no ComponentUI class"

java - 使用 jbutton 从 jtable 中删除一行

java - 在 Java GUI 中将数据从 JTable 插入 MySQL 表

java - 即使在移动到元素并在 Selenium Java 中显式等待后,元素也无法交互

java - 在 Java 中向 TitanDB Graph 添加顶点

java - 调度鼠标事件