【发布时间】:2016-08-02 20:31:43
【问题描述】:
我正在尝试将组件放入具有不同尺寸的面板中。但是,我意识到 GridLayout 将大小相同的部分分开。如何实现如下图所示
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class PanelDemo {
PanelDemo() {
// Create a new JFrame container. Use the default
// border layout.
JFrame jfrm = new JFrame("Use Three JPanels with Different Sizes");
// Specify FlowLayout manager.
jfrm.getContentPane().setLayout(new GridLayout(1, 3));
// Give the frame an initial size.
jfrm.setSize(900, 300);
// Terminate the program when the user closes the application.
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create the first JPanel.
JPanel jpnl = new JPanel();
jpnl.setLayout(new GridLayout(2, 4));
// Set the preferred size of the first panel.
jpnl.setPreferredSize(new Dimension(500, 300));
// Make the panel opaque.
jpnl.setOpaque(true);
// Add a blue border to the panel.
jpnl.setBorder(
BorderFactory.createLineBorder(Color.BLUE));
// Create the second JPanel.
JPanel jpnl2 = new JPanel();
//jpnl2.setLayout(new FlowLayout());
// Set the preferred size of the second panel.
jpnl2.setPreferredSize(new Dimension(300, 300));
// Make the panel opaque.
jpnl2.setOpaque(true);
jpnl2.setBorder(
BorderFactory.createLineBorder(Color.RED));
JPanel jpnl3 = new JPanel();
jpnl3.setOpaque(true);
jpnl3.setPreferredSize(new Dimension(100, 300));
jpnl3.setBorder(
BorderFactory.createLineBorder(Color.ORANGE));
// Add the panels to the frame.
jfrm.getContentPane().add(jpnl);
jfrm.getContentPane().add(jpnl3);
jfrm.getContentPane().add(jpnl2);
// Display the frame.
jfrm.setVisible(true);
}
public static void main(String args[]) {
// Create the frame on the event dispatching thread.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new PanelDemo();
}
});
}
}
【问题讨论】:
-
BorderLayoutusingLINE_START,CENTER&LINE_END约束可以做到这一点。但如果 GUI 可调整大小,中心面板将获得额外的空间.. -
顺便说一句 - 每个面板都有什么?如果是“组件”,最好允许用于面板的布局提供有关首选尺寸的提示,而不是显式设置它。然后不要调用
jfrm.setSize(900, 300);- 只需调用jfrm.pack();(毕竟添加组件).. -
BoxLayout?网格包布局?阅读 Layout Managers 上的 Swing 教程。每个布局管理器都有不同的规则来调整框架大小的大小。无论您使用什么布局都取决于您的确切要求。与每个布局管理器一起玩,然后确定最适合您的要求。
-
我会将带有 gridlayout(2,4) 的按钮放入第一个,第二个只是为了显示一点空白区域,第三个是按钮 gridlayout(2,2)。我应该总是/通常使用pack而不是setSize吗? @安德鲁汤普森
-
pack()将使 GUI 的大小达到所需的大小,以容纳组件和框架装饰。setSize(..)只是猜测该大小应该是多少。根据您的描述,很明显不需要第二个面板。可以使用应用于第一个面板的EmptyBorder来实现。给我几分钟,我会创建布局..
标签: java swing jpanel layout-manager