好的,所以我花了很多时间寻找问题的答案,而且运气很少。我正在尝试将我绘制的图形添加到JPanel,然后将JPanel添加到JFrame。这是我的代码:
import java.awt.*;
import javax.swing.*;
public class Testing
{
public static void main(String[] args)
{
JFrame f = new JFrame("JFrame with a JPanel");
f.setSize(500,500);
JLabel l1 = new JLabel("Hello !");
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
DrawBox dB = new DrawBox(400,200,20,20);
p1.add(l1);
p2.add(dB);
f.add(p1,BorderLayout.PAGE_END);
f.add(p2,BorderLayout.CENTER);
//f.add(dB); //Adding directly to the JFrame works fine
f.setVisible(true);
}
}
接下来是创建图形的类
public class DrawBox extends JPanel {
int xVal = 0;
int yVal = 0;
int width = 0;
int height = 0;
public DrawBox(int x, int y, int w, int h) {
xVal = x;
yVal = y;
width = w;
height = h;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(xVal, yVal, width, height);
}
}
如果我直接将DrawBox添加到JFrame,它似乎工作正常。但是,如果我尝试直接向JFrame添加多个图形,则只会显示其中一个。
答案 0 :(得分:3)
来自您的评论
//f.add(dB); //Adding directly to the JFrame works fine
它的工作原理是因为框架的BorderLayout不符合首选大小。它将拉伸绘图面板以适应。
另一方面,当您在另一个面板中添加绘图面板时,包装器面板有一个默认的FlowLayout, 尊重首选尺寸。如果未通过覆盖getPreferredSize()
@Override
public Dimension getPreferredSize() {
return new Dimension( ... , ... );
}