0

我有一个自定义表头渲染器,它将在 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() 中。我已经尝试了两种方法,但都没有奏效。

4

1 回答 1

1

尝试UIManager直接使用 s 值。

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 委托直接绘制的。

更新了示例

在此处输入图像描述

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

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

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;
        }       
    }   
}
于 2013-04-12T04:38:09.423 回答