Java 如何设置JLabel';背景和边框是否与表头相同?

Java 如何设置JLabel';背景和边框是否与表头相同?,java,swing,jtable,jlabel,jtableheader,Java,Swing,Jtable,Jlabel,Jtableheader,我想使用JLabel重新创建表格标题外观。JLabel的外观和感觉需要与系统指定的JTableHeader完全相同 这就是我迄今为止所尝试的: JLabel header = new JLabel("Title"); header.setOpaque(true); header.setBackground(UIManager.getColor(new JTableHeader().getBackground())); header.setBorder(UIManager.getBorder(ne

我想使用
JLabel
重新创建表格标题外观。
JLabel
的外观和感觉需要与系统指定的
JTableHeader
完全相同

这就是我迄今为止所尝试的:

JLabel header = new JLabel("Title");
header.setOpaque(true);
header.setBackground(UIManager.getColor(new JTableHeader().getBackground()));
header.setBorder(UIManager.getBorder(new JTableHeader().getBorder()));
但是,
UIManager
返回颜色和边框的
null

有什么想法吗

以下是我设置外观和感觉的方式:

javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());

在尝试之前,您需要设置应用程序的外观:

header.setBackground(UIManager.getColor(new JTableHeader().getBackground()));
header.setBorder(UIManager.getBorder(new JTableHeader().getBorder()));
您应该首先设置外观和感觉,如下所示:

  try {
    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(info.getName())) {
            UIManager.setLookAndFeel(info.getClassName());
            break;
        }
    }
} catch (Exception e) {
    // If Nimbus is not available, you can set the GUI to another look and feel.
}
以下是一个例子:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.JTableHeader;

public class Test {

    public Test() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    //set nimbus look and feel
                    for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                        if ("Nimbus".equals(info.getName())) {
                            UIManager.setLookAndFeel(info.getClassName());
                            break;
                        }
                    }
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
                    e.printStackTrace();
                }

                new Test();
            }
        });
    }

    private void initComponents() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel header = new JLabel("Title");
        header.setBackground(UIManager.getColor(new JTableHeader().getBackground()));
        header.setBorder(UIManager.getBorder(new JTableHeader().getBorder()));

        frame.add(header);

        frame.pack();
        frame.setVisible(true);
    }
}


尝试从
UIManager
获取默认值:

Color color = UIManager.getColor("TableHeader.background");
Border border = UIManager.getBorder("TableHeader.CellBorder");

我想我将创建一个没有任何行的
JTable
,并将
JTextPane
放在正下方。 它就像魅力一样

JTextPane textPane = new JTextPane();
JPanel panel = new JPanel(new BorderLayout());

JTable table = new JTable(0, 1);
table.setPreferredScrollableViewportSize(new Dimension(600, 0));
JScrollPane js = new JScrollPane(table)

panel.add(js, BorderLayout.NORTH);
panel.add(new JScrollPane(textPane),BorderLayout.CENTER);

这涉及到更多的问题,而不仅仅是获取表格标题的颜色和边框。每个单元格/列都由
TableCellRenderer
呈现,这意味着可以忽略
UIManager
返回的值

例如,下面呈现
JTableHeader
,并基于窗口的外观下的
UIManager
返回的值将边框/背景应用于
JLabel

正如你所看到的,它们之间有很大的区别

然而,如果您感兴趣的只是在滚动窗格的另一个组件顶部显示某种“组标题”,那么您只需将
JTableHeader
直接添加到滚动窗格列视图中即可

public class TestHeader {

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

    public TestHeader() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                TableColumnModel model = new DefaultTableColumnModel();
                final TableColumn column = new TableColumn(0, 250);
                column.setHeaderValue("Test");
                model.addColumn(column);

                JTableHeader header = new JTableHeader();
                header.setColumnModel(model);

                final JTextArea textArea = new JTextArea();

                JScrollPane scrollPane = new JScrollPane(textArea);
                scrollPane.setColumnHeaderView(header);

                textArea.addComponentListener(new ComponentAdapter() {
                    @Override
                    public void componentResized(ComponentEvent e) {
                        column.setWidth(textArea.getWidth());
                    }
                });

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

已更新

public class TestHeader {

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

    public TestHeader() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                TableColumnModel model = new DefaultTableColumnModel();
                final TableColumn column = new TableColumn(0, 250);
                column.setHeaderValue("I don't see the problem");
                model.addColumn(column);

                final JTableHeader header = new JTableHeader();
                header.setColumnModel(model);

                DefaultTableModel tm = new DefaultTableModel(new Object[]{"A", "B", "C"}, 0);
                tm.addRow(new Object[]{"1", "2", "3", "4"});
                tm.addRow(new Object[]{"5", "6", "7", "8"});
                tm.addRow(new Object[]{"9", "10", "11", "12"});
                tm.addRow(new Object[]{"13", "14", "15", "16"});
                final JTable table = new JTable(tm);

                final JScrollPane scrollPane = new JScrollPane(table);
                /**
                 * For some reason, the header isn't being applied as soon as the
                 * table is added to the scroll pane, so we need to jump our next
                 * request to the end of the of event queue so that it will
                 * occur some time in the future
                 */
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        scrollPane.setColumnHeaderView(header);
                    }

                });

                table.addComponentListener(new ComponentAdapter() {
                    @Override
                    public void componentResized(ComponentEvent e) {
                        column.setWidth(table.getWidth());
                    }

                });

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

        });
    }

}



Aw shucks,1+对您和OP.@Max返回的颜色为RGB(240240),边框为
null
。我在电脑上。@Igor其价值取决于外观和感觉。您使用的LaF是什么?@Max外观和感觉是根据系统设置的。我在电脑上,所以我使用的是“windows”L&F。奇怪,对于
windows
它返回
javax.swing.plaf.ColorUIResource[r=240,g=240,b=240]
。有关详细信息,请参见@camickr。我确实设置了外观:
setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName())@Igor您的系统外观可能没有边框颜色。我建议在这种情况下使用Java L&F,因为它们似乎都能很好地工作。当然,如果它们不工作,
JTableHeader
会如何显示呢?@Igor我不能肯定,但我的意思是它没有JTable边框的颜色(这对系统来说不是真正的冲突,只是没有使用边框)在我的示例中,我甚至忽略了对border coour的调用,但它看起来仍然相同。您可以将示例设置为“Windows”外观,并创建一个
JTable
,看看它是否相同吗?我认为这可能是一个巧合,它们在灵光中是相同的。颜色和边界资源,取决于使用过的L&F,可能很重要,因为金属并不重要matter@mKorbel你能说得更清楚些吗?对于官方的Sun/Oracle L&Fs@mKorbel这:
java.swing.plaf.BorderUIResource$CompoundBorderUIResouce@fadfa
用于边界。我可以使用它吗?@mKorbel在您建议的应用程序中,如果您在“外观”菜单中选择“Windows”,并选择TableHeader项,您将看到类似Windows classic的组件。但是,它们所显示的表头有一个不同的外观,这就是我想要的外观。如果您要这样做,只需使用一列创建
JTableHeader
,并将其添加到滚动窗格的列头中即可使用
JTextArea
,但如果将其替换为
JTable
,则标题根本不会显示。如果您想将2列表中的2个标题替换为1个标题,这将非常有用。有没有办法使用
JTable
而不是
JTextArea
?它不是线程
invokeLater
直接在事件队列上放置一个
runnable
,然后在将来某个时候在EDT上执行该事件队列;)@igor每次将表添加到滚动窗格时,都会安装它的标题。如果这是一个主要问题,您可以从JTable和override扩展到,这将使您有机会用自己的实现替换头部再次感谢。我想我已经修好了。我删除了runnable,只添加了以下内容:
scrollPane.setColumnHeaderView(header)//将标题添加到滚动窗格中。setTableHeader(标题);//将此标题也添加到表中
我不知道为什么,但它似乎有效。