java - 使用 Nimbus 的 TableHeaderRenderer

标签 java swing nimbus tablecellrenderer jtableheader

我有一个自定义表头渲染器,它将在 JComponent 内具有标准标签和一个按钮。

我遇到的问题是默认渲染器返回的标签。对默认渲染器的调用提供了标准标签。如果我按原样返回,它看起来就像预期的那样。如果我尝试修改背景或边框,则不会发生任何变化。然而,修改前景确实达到了预期的效果。我不想查看排序图标,因此我尝试构建一个看起来相同但减去图标的 JLabel。这也不能正常工作。我的 JLabel 不透明。

JLabel l = (JLabel)table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
this.lbl.setBackground(l.getBackground());
return this.lbl;

我查看了 DefaultTableHeaderRenderer 的源代码,但找不到默认类正在执行的任何特殊操作。

我也尝试过以下方法,但没有效果。

this.lbl.setOpaque(true);
this.lbl.setFont(UIManager.getFont("TableHeader.font"));
this.lbl.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
this.lbl.setBackground(UIManager.getColor("TableHeader.background"));
this.lbl.setForeground(UIManager.getColor("TableHeader.foreground"));
return this.lbl;

编辑:澄清。上面的两个代码片段都位于我的自定义渲染器的 getTableCellRenderComponent() 内。两种方法我都试过了,都没有效果。

最佳答案

尝试直接使用 UIManager 的值。

TableHeader.background = DerivedColor(color=214,217,223 parent=control offsets=0.0,0.0,0.0,0 pColor=214,217,223
TableHeader.font = javax.swing.plaf.FontUIResource[family=SansSerif,name=sansserif,style=plain,size=12]
TableHeader.foreground = DerivedColor(color=0,0,0 parent=text offsets=0.0,0.0,0.0,0 pColor=0,0,0
TableHeader.opaque = true

例如 UIManager.getColor("TableHeader.background")

我认为您会发现的边框实际上是由 UI 委托(delegate)直接绘制的。

已更新示例

enter image description here

从包含的图像中,很明显使用 UIManager 确实提供了获取 header 使用的值所需的一些基本信息,但它确实突出显示渲染器正在执行一些特殊的绘制获取阴影。

第二列是默认渲染器,第三列是厚颜无耻的。它基本上是直接从表头窃取单元格渲染器......

package testcellrenderer;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TestCellRenderer {

    public static void main(String[] args) {
        new TestCellRenderer();
    }

    public TestCellRenderer() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            DefaultTableModel model = new DefaultTableModel(
                            new Object[][]{{"Testing", "Testing", "Testing"}},
                            new Object[]{"Test A", "Test B", "Test C"}
                            );
            JTable table = new JTable(model);
            table.getColumn("Test A").setCellRenderer(new TestTableCellRenderer());
            table.getColumn("Test C").setCellRenderer(table.getTableHeader().getDefaultRenderer());

            setLayout(new BorderLayout());
            add(new JScrollPane(table));
        }

    }

    protected class TestTableCellRenderer extends DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

            Color background = UIManager.getColor("TableHeader.background");
            Color foreground = UIManager.getColor("TableHeader.foreground");
            Font font = UIManager.getFont("TableHeader.font");
            boolean opaque = UIManager.getBoolean("TableHeader.opaque");

            setBackground(background);
            setForeground(foreground);
            setFont(font);
            setOpaque(opaque);

            return this;
        }       
    }   
}

关于java - 使用 Nimbus 的 TableHeaderRenderer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15962832/

相关文章:

java - 当我尝试使用 HTTP 访问页面时,页面中的 PHP 未得到解析

java - GWT 单元格表添加基于对象的选择单元

java - 如何以编程方式单击 JTabbedPane 中的选项卡?

java - Nimbus 中的默认字体

Java长正则表达式

java - 为什么我们将字符串数组作为参数传递给 main() 方法,为什么不传递任何集合类型或包装类型或原始类型?

java - 无法使 swing 撤消/重做系统适用于简单的绘画程序。

java - 我如何正确对齐此文本?

java - 灵气外观不可用

centos - 在 Apache Storm UI 上运行多个主管时出错