我对编程比较陌生,所以如果这个问题很愚蠢,我很抱歉 . 我正在创建一个Java程序,它在JPanel中包含一个JButton,而JPanel在JFrame中 . 另一个按钮位于JPanel外部,但仍在JFrame中 . 我将布局设置为BoxLayout . 我的问题是,我制作黑色的面板占据了整个JFrame,除了第二个按钮的位置 . 如何制作JPanel,只占用第一个按钮周围的区域?
public class alt {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton button1 = new JButton("button 1");
JButton button2 = new JButton("button 2");
public alt(){
frame.setVisible(true);
frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
panel.setBackground(Color.black);
frame.setTitle("test");
frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
panel.add(button1);
frame.add(panel);
frame.add(button2);
button2.setAlignmentX(Component.CENTER_ALIGNMENT);
}
}
2 回答
您可以使用不同的布局管理器,它可以让您更好地控制决定如何分配空间和处理填充,例如
GridBagLayout
...请查看Laying Out Components Within a Container了解更多详情
面板占据框架内容窗格大部分的原因在于
BoxLayout
管理器使用组件的最小值,首选值和最大值的方式 . 它考虑了组件的最大值 . 由于JPanel
的最大值很大,因此占用了所有可用空间 . 解决方案是更改面板的最大值 . 但是,这是不好的做法 . 我不建议使用BoxLayout
管理器 - 它非常弱并导致代码不佳 .我建议使用
MigLayout
管理器或GroupLayout
管理器 .我提供了三种解决方案:更正的
BoxLayout
解决方案,MigLayout
解决方案和GroupLayout
解决方案 .BoxLayout solution
我们确定按钮的最大尺寸,并将面板的大小更改为比按钮大一点 .
这不是一个干净的解决方案 . 通常,我们应该避免在应用程序代码中调用
getMaximumSize()
和setMaximumSize()
- 这是布局管理器's job. Also in three occasions, we use fixed pixel widths: when we define an empty border, a vertical strut, and a maximum panel'的大小 . 但是,此代码不可移植 . 当屏幕分辨率发生变化时,像素宽度会发生变化 . 这是BoxLayout
经理的缺点 .MigLayout solution
该解决方案更清洁,更便携 .
MigLayout
是第三方经理,因此我们需要下载其他库 .GroupLayout solution
GroupLayout
是一个内置的布局管理器 . 使用MigLayout
,它们是最便携,最灵活的布局管理器 .