我目前有一个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);
问题和框架的并排侧视图,然后将其添加到选项卡:
编辑:乔治Z.的回答对我帮助很大。
就像他说的那样解决问题: 不要将内容添加到主框架,而是将它们添加到Jpanel并将其添加到JTabbedPane。 如果您有一个Jpanel要添加到在paintComponent中包含替代的选项卡中,则必须将该类创建为Jpanel,以便:
JPanel panel = new LineDrawer([Enter parameters]);
panel.setLayout([Enter Layout]);
答案 0 :(得分:1)
您处理此问题的方式似乎很复杂,因此有这种奇怪的行为。 (看起来像是一个外观问题?-显示设置它的代码部分)
但是,我建议您仅创建一个JFrame
(this 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添加到框架中(内容窗格)。框架只有一个成分。