我目前正在阅读Head First Java关于制作GUI的第12章。他们刚刚提到JFrame分为中心、北部、南部、东部和西部。然后,本书使用2参数add()方法将指定的组件添加到具有该JFrame的指定区域中。
我可以为五个区域中的每一个添加一个JButton。我也可以把我自己的JPanel添加到中心区域,周围都是JButton。但当我试图把JPanel加入到中心以外的任何区域时,JPanel都不会出现。
在过去的一个小时里,我真的搜索了整个网络和Stack Overflow,没有发现任何提到在JFrame的中心以外的任何区域添加JPanel的内容。所以我的问题是:是否可以将JPanel添加到JFrame的北部、南部、东部或西部区域?
提前感谢任何能帮助我的人。
以下是我一直试图在北部地区用我的JPanel运行的代码:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.BorderLayout;
public class StackQ {
JFrame frame;
public static void main(String [] args) {
StackQ gui = new StackQ();
gui.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("location test");
JButton button2 = new JButton("location test");
JButton button3 = new JButton("location test");
JButton button4 = new JButton("location test");
myDrawPanel custom = new myDrawPanel();
frame.getContentPane().add(button, BorderLayout.CENTER);
frame.getContentPane().add(button2, BorderLayout.EAST);
frame.getContentPane().add(button3, BorderLayout.WEST);
frame.getContentPane().add(button4, BorderLayout.SOUTH);
frame.getContentPane().add(custom, BorderLayout.NORTH);
frame.setSize(300,300);
frame.setVisible(true);
}
}
class myDrawPanel extends JPanel {
public void paintComponent(Graphics g) {
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color random = new Color(red, green, blue);
g.setColor(random);
g.fillOval(20,20,100,100);
}
}
这可能更清楚,但在BorderLayout
文档中有描述:
组件根据其首选尺寸和容器尺寸的限制进行布局。。。。CCD_ 2分量可以水平地和垂直地拉伸以填充剩余的任何空间。
换句话说,CENTER
组件将被拉伸(如果需要的话)以填充应用程序,并且任何其他组件都需要指定一个首选大小,以便从CENTER
中获取一些。
默认情况下,JButton
根据按钮的内容指定首选大小。另一方面,JPanel
没有-它的首选大小取决于它的内容,而您的JPanel
没有任何内容,因此其首选大小为零。
简而言之,为JPanel
指定一个首选大小,BorderLayout
将尝试为面板分配至少那么多空间。
为了获得想要的结果,我首先在StackQ类的顶部导入了Dimension类(这是必需的,因为稍后在go()方法中使用的setPreferredSize()方法接受Dimension类型的参数):
import java.awt.Dimension;
然后,在myDrawPanel类实例化后,我立即将此代码添加到go()方法中:
Dimension dims = new Dimension(1366, 200);
custom.setPreferredSize(dims);
我选择1366作为宽度,因为这就是我的屏幕有多大
感谢大家的帮助!