添加选项卡时 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]);
您处理此问题的方式似乎非常复杂,因此出现了这种奇怪的行为。 (看起来像是外观问题?- 显示设置它的代码部分)
但是,我建议您只创建一个 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);
});
}
}
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 添加到框架(内容窗格)中。框架只有一个组件。
我目前有一个 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]);
您处理此问题的方式似乎非常复杂,因此出现了这种奇怪的行为。 (看起来像是外观问题?- 显示设置它的代码部分)
但是,我建议您只创建一个 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);
});
}
}
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 添加到框架(内容窗格)中。框架只有一个组件。