添加选项卡时,JFrame变为蓝色

时间:2019-08-10 09:00:46

标签: java swing jframe

我目前有一个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);

问题和框架的并排侧视图,然后将其添加到选项卡:

enter image description here

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

就像他说的那样解决问题: 不要将内容添加到主框架,而是将它们添加到Jpanel并将其添加到JTabbedPane。 如果您有一个Jpanel要添加到在paintComponent中包含替代的选项卡中,则必须将该类创建为Jpanel,以便:

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

1 个答案:

答案 0 :(得分:1)

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

但是,我建议您仅创建一个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);
        });
    }

}

基于此评论的帖子编辑:

  

我确实有一个添加了很多元素的Jframe,所以有点   将所有内容切换到面板很麻烦;

JFrame不能包含很多元素。您来看看how to use root panes.JFrame的“具有很多元素”的容器就是它的根窗格,它的大部分由它的contentpane完成。 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添加到框架中(内容窗格)。框架只有一个成分。