Java JTable头单元中的JPanel

Java JTable头单元中的JPanel,java,swing,jtable,jtableheader,Java,Swing,Jtable,Jtableheader,我正在试验用JPanel替换JTable头单元(JLabel)的可能性。理由是要有一个更灵活的容器来放置其他与标题相关的内容,即多列排序指示器。安装一个面板很简单,但是维护LAF似乎很麻烦 我的尝试是覆盖标题渲染器并将内容打包到JPanel中。它可以工作,但默认的LAF已按预期消失 import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import javax.

我正在试验用JPanel替换JTable头单元(JLabel)的可能性。理由是要有一个更灵活的容器来放置其他与标题相关的内容,即多列排序指示器。安装一个面板很简单,但是维护LAF似乎很麻烦

我的尝试是覆盖标题渲染器并将内容打包到JPanel中。它可以工作,但默认的LAF已按预期消失

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
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;
import javax.swing.table.TableCellRenderer;

public class JTableHeaderExperimental {

    static class XTableHeaderCellRenderer extends DefaultTableCellRenderer{
        private TableCellRenderer defaultRenderer;

        public XTableHeaderCellRenderer(TableCellRenderer defaultRenderer) {
            this.defaultRenderer = defaultRenderer;
        }

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

            // For the simplicity, skipping sorting icon related stuff
            GridBagConstraints constraints = new GridBagConstraints();
            JPanel panel = new JPanel(new GridBagLayout());
            JLabel extraLabel = new JLabel("Extra label");
            JLabel originalLabel = (JLabel) defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            constraints.fill = GridBagConstraints.HORIZONTAL;
            constraints.gridx = 0;
            constraints.gridy = 0;
            panel.add(extraLabel, constraints);

            constraints.gridx = 0;
            constraints.gridy = 1;
            panel.add(this, constraints);

            System.out.println("Original Header Border: " + originalLabel.getBorder().getClass());
            System.out.println("New Header Border: " + this.getBorder().getClass());
            System.out.println("Header Panel Border: " + panel.getBorder().getClass());

            return panel;
        }
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException
                | IllegalAccessException | UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

        Object[][] data = {
                {"Test", "Data"},
                {"Comes", "Here"}               
        };
        String[] columnNames = {"Header 1", "Header 2"};
        JFrame frame = new JFrame();
        JTable table = new JTable();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table.setModel(model);
        table.getTableHeader().setDefaultRenderer(new XTableHeaderCellRenderer(table.getTableHeader().getDefaultRenderer()));
        frame.setSize(200, 200);

        frame.add(new JScrollPane(table));
        frame.setVisible(true);

    }
}
运行此代码将提供以下输出:

Original Header Border: class javax.swing.plaf.synth.SynthBorder
New Header Border: class javax.swing.border.EmptyBorder
Header Panel Border: class javax.swing.plaf.synth.SynthBorder
并提出:

与默认系统LAF相反:


我想知道是否有可能创建一个面板并传递原始标签的LAF细节(即边框、bg/fg颜色)

你可能会从中得到一些想法。@trashgod我知道这一点,特别是公认答案的技术方面/第三个要点清楚地说明了这一点。但是我想知道是否有人尝试过。luca的
MouseAdapter
?@trashgod这个实现似乎超出了使用适配器的范围,我几乎做到了,只是一些小的调整。一旦它足够稳定/整洁,我将发布完整的实现。它涉及到将一些Swing.Synth类迁移到我的本地SwingX代码库(由于过度使用包本地静态方法)。此外,我还需要在绘制JPanel use Region.Button后获取它(因为原始背景是用Region.Button绘制的)。