添加选项卡时 JFrame 变成蓝色

JFrame turns blue when adding tabs

我目前有一个 Jframe,我想将其添加到选项卡。 (我使用一个框架只是为了测试目的,以确保外观和感觉正确,但是当尝试将它添加到 JTabbedPane 时,框架开始看起来是蓝色的(顶部也很奇怪)。

我尝试将我的设置从原始框架复制到新框架,但这没有帮助。

JTabbedPane tabs = new JTabbedPane();
tabs.addTab("1", frame.getContentPane());
JFrame FinalFrame = new JFrame();
FinalFrame.setDefaultLookAndFeelDecorated(true);
FinalFrame.setSize(WIDTH, HEIGTH);
FinalFrame.setLocation(100, 150);
FinalFrame.setTitle("Primal-Pvm Notification center");
FinalFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FinalFrame.add(tabs);

将问题和框架添加到选项卡之前的并排视图:

编辑:George Z. 的回答对我帮助很大。

像他说的解决问题: 不要将东西添加到您的主框架,而是将它们添加到 Jpanel 并将其添加到 JTabbedPane。 如果您有一个要添加到包含 paintComponent 覆盖的选项卡的 Jpanel,则必须创建该 class 作为 Jpanel,因此:

JPanel panel = new LineDrawer([Enter parameters]);
panel.setLayout([Enter Layout]);

您处理此问题的方式似乎非常复杂,因此出现了这种奇怪的行为。 (看起来像是外观问题?- 显示设置它的代码部分)

但是,我建议您只创建一个 JFramethis question 解释了为什么您应该这样做),将其内容窗格的布局设置为 BorderLayout 并保持原样这个。弄乱内容窗格的情况很少见。之后创建独立的 JPanels 代表您想要的选项卡。最后用这些面板创建一个 JTabbedPane 并将其添加到 JFrame.

的内容框架中

一个小例子是:

public class TabbedPanelExample extends JFrame {
    public TabbedPanelExample() {
        super("test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        JTabbedPane pane = new JTabbedPane();
        pane.addTab("FirstTab", createFirstTab());
        pane.addTab("SecondTab", createSecondTab());

        add(pane);
        setSize(400, 400);
        setLocationRelativeTo(null);
    }

    private Component createFirstTab() {
        JPanel panel = new JPanel(new FlowLayout());
        panel.add(new JLabel("Some Component"));
        panel.add(new JTextField("Some Other Component"));
        return panel;
    }

    private Component createSecondTab() {
        JPanel panel = new JPanel(new FlowLayout());
        panel.add(new JLabel("Some Component"));
        panel.add(new JButton("Some Other Component"));
        return panel;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new TabbedPanelExample().setVisible(true);
        });
    }

}

Post 根据此评论编辑:

Well I do have a Jframe with a lot of elements added to it so it kinda is a hassle to switch it all to panels;

一个JFrame不能有很多元素。你看一下 how to use root panes. JFrame 的 "has a lot of elements" 的容器是它的根窗格,它主要由它的内容窗格完成。当您 frame.add(component) 时,您将组件添加到其内容窗格。你猜怎么着? JFrame 的内容窗格是一个 JPanel。面板也是如此。

现在为了完成这项工作,请按照我说的去做 frame.setLayout(new BorderLayout(); //changes layout to contentpane。假设您有一堆组件(假设是 comp1、comp2)并且您正在添加它们:

frame.add(comp1);
frame.add(comp2);

你必须做到以下几点才能说清楚。创建一个 JPanel 而不是 frame.add(comp1),做 panel.add(comp1)。所以这个 JPanel 具有您在 JFrame 中添加的所有组件。之后创建你的 JTabbedPane:

JTabbedPane pane = new JTabbedPane();
pane.addTab("tab", panel);

最后将此窗格添加到 JFrame:

的内容窗格
frame.add(pane);

总而言之,您会将已添加到框架中的所有组件移动到 JPanel 中,将此 JPanel 添加到 JTabbedPane 中,最后将此 JTabbedPane 添加到框架(内容窗格)中。框架只有一个组件。