setLayout() 到 BoxLayout 导致 JPanels 消失
setLayout() to BoxLayout causes JPanels to disappear
这是我的第一个 post,所以如果我没有包含完整描述我的问题所需的所有信息,我提前道歉。
由于在使用 BoxLayout 时遇到挫折,我在显示 JFrame 时遇到了问题。我想创建水平使用框布局来创建两个部分,然后每个部分将再次使用 BoxLayout(垂直)。但是,当我尝试将 JPanel 的布局设置为 BoxLayout 时,面板消失了。此外,我选择的首选尺寸与我给它们的值无关。不是分成 67/33,而是分成 85/15。
我已经尝试更改 JPanel 的布局,但进展甚微。此外,我尝试过调整尺寸,虽然我可以得到我满意的视觉效果,但我仍然想知道为什么我的 67/33 分割在理论上不起作用。
下面是我的代码:
import javax.swing.*;
import java.awt.*;
public class test {
public static void beginPoS() {
// instantiating the opening frame
JFrame openingPage = new JFrame("Point of Sales Simulation");
openingPage.setSize(750, 600);
openingPage.setVisible(true);
openingPage.setLocationRelativeTo(null);
openingPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
openingPage.setResizable(false);
Container contents = openingPage.getContentPane();
contents.setLayout(new BorderLayout());
JPanel overall = new JPanel();
overall.setLayout(new BoxLayout(overall, BoxLayout.X_AXIS));
JPanel panel1 = new JPanel();
panel1.setBackground(Color.RED);
panel1.setPreferredSize(new Dimension(300, 600));
panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));
JPanel panel2 = new JPanel();
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
panel2.setBackground(Color.GREEN);
panel2.setPreferredSize(new Dimension(50, 600));
overall.add(panel1);
overall.add(panel2);
openingPage.add(overall);
}
public static void main(String[] args) {
beginPoS();
}
}
多个问题:
panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));
JPanel panel2 = new JPanel();
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
Box 布局似乎不喜欢您设置了子面板的布局并且没有输入任何组件。
因此每个子面板的首选大小为 (0, 0)。所以它不能增长。
删除上面两个setLayout(...)语句。
Instead of being split into 67/33, the split is rather 85/15.
嗯,你打错了。一个面板的宽度为 50,另一个面板的宽度为 300。
BoxLayout 将首先分配首选space。由于您将帧的大小硬编码为 750,因此您将剩下大约 400 个 space 像素。然后 BoxLayout 将为每个面板分配 200 像素以填充可用的 space.
openingPage.setSize(750, 600);
openingPage.setVisible(true);
openingPage.setLocationRelativeTo(null);
openingPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
openingPage.setResizable(false);
上面的代码应该在所有组件都添加到框架之后执行,顺序很重要。它应该更像:
openingPage.setResizable(false);
//openingPage.setSize(750, 600);
openingPage.pack();
openingPage.setVisible(true);
openingPage.setLocationRelativeTo(null);
openingPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
通常您应该使用 pack()
而不是 setSize(...)
此布局管理器将以其首选大小显示组件。您希望在打包框架之前设置可调整大小 属性,因为这会影响框架的边框大小。 pack 方法需要该信息。
我建议您查看 Layout Manager 上 Swing 教程中的演示代码。该代码将向您展示如何更好地构建 类,以便在 Event Dispatch Thread (EDT).
上创建 GUI
这是我的第一个 post,所以如果我没有包含完整描述我的问题所需的所有信息,我提前道歉。
由于在使用 BoxLayout 时遇到挫折,我在显示 JFrame 时遇到了问题。我想创建水平使用框布局来创建两个部分,然后每个部分将再次使用 BoxLayout(垂直)。但是,当我尝试将 JPanel 的布局设置为 BoxLayout 时,面板消失了。此外,我选择的首选尺寸与我给它们的值无关。不是分成 67/33,而是分成 85/15。
我已经尝试更改 JPanel 的布局,但进展甚微。此外,我尝试过调整尺寸,虽然我可以得到我满意的视觉效果,但我仍然想知道为什么我的 67/33 分割在理论上不起作用。
下面是我的代码:
import javax.swing.*;
import java.awt.*;
public class test {
public static void beginPoS() {
// instantiating the opening frame
JFrame openingPage = new JFrame("Point of Sales Simulation");
openingPage.setSize(750, 600);
openingPage.setVisible(true);
openingPage.setLocationRelativeTo(null);
openingPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
openingPage.setResizable(false);
Container contents = openingPage.getContentPane();
contents.setLayout(new BorderLayout());
JPanel overall = new JPanel();
overall.setLayout(new BoxLayout(overall, BoxLayout.X_AXIS));
JPanel panel1 = new JPanel();
panel1.setBackground(Color.RED);
panel1.setPreferredSize(new Dimension(300, 600));
panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));
JPanel panel2 = new JPanel();
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
panel2.setBackground(Color.GREEN);
panel2.setPreferredSize(new Dimension(50, 600));
overall.add(panel1);
overall.add(panel2);
openingPage.add(overall);
}
public static void main(String[] args) {
beginPoS();
}
}
多个问题:
panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));
JPanel panel2 = new JPanel();
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
Box 布局似乎不喜欢您设置了子面板的布局并且没有输入任何组件。
因此每个子面板的首选大小为 (0, 0)。所以它不能增长。
删除上面两个setLayout(...)语句。
Instead of being split into 67/33, the split is rather 85/15.
嗯,你打错了。一个面板的宽度为 50,另一个面板的宽度为 300。
BoxLayout 将首先分配首选space。由于您将帧的大小硬编码为 750,因此您将剩下大约 400 个 space 像素。然后 BoxLayout 将为每个面板分配 200 像素以填充可用的 space.
openingPage.setSize(750, 600);
openingPage.setVisible(true);
openingPage.setLocationRelativeTo(null);
openingPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
openingPage.setResizable(false);
上面的代码应该在所有组件都添加到框架之后执行,顺序很重要。它应该更像:
openingPage.setResizable(false);
//openingPage.setSize(750, 600);
openingPage.pack();
openingPage.setVisible(true);
openingPage.setLocationRelativeTo(null);
openingPage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
通常您应该使用 pack()
而不是 setSize(...)
此布局管理器将以其首选大小显示组件。您希望在打包框架之前设置可调整大小 属性,因为这会影响框架的边框大小。 pack 方法需要该信息。
我建议您查看 Layout Manager 上 Swing 教程中的演示代码。该代码将向您展示如何更好地构建 类,以便在 Event Dispatch Thread (EDT).