Java将图形添加到JPanel,然后添加到JFrame

Java将图形添加到JPanel,然后添加到JFrame,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,好吧,我花了很多时间寻找我问题的答案,但我运气很差。我正在尝试将我绘制的图形添加到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(5

好吧,我花了很多时间寻找我问题的答案,但我运气很差。我正在尝试将我绘制的图形添加到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,则只会显示其中一个图形。

根据您的评论

//f.add(dB)//直接添加到JFrame效果很好

这是因为框架的边框布局不考虑首选尺寸。它将拉伸绘图面板以适合

另一方面,在另一个面板中添加“包裹”图形面板时,包裹面板具有默认的FlowLayout,该布局不考虑首选尺寸。如果未通过重写
getPreferredSize()


+1在您的自定义类上使用setPreferredSize()setMinimumSize()和setMaximumSize()几乎是一次完整的尝试。@nespowerglood请参见(是)。上面的答案是否建议根本不重写这些方法?
@Override
public Dimension getPreferredSize() {
    return new Dimension( ... , ... );
}