Java将JP添加到JPanel,然后添加到JFrame

时间:2014-05-20 18:27:17

标签: 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(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添加多个图形,则只会显示其中一个。

1 个答案:

答案 0 :(得分:3)

来自您的评论

  

//f.add(dB); //Adding directly to the JFrame works fine

它的工作原理是因为框架的BorderLayout不符合首选大小。它将拉伸绘图面板以适应。

另一方面,当您在另一个面板中添加绘图面板时,包装器面板有一个默认的FlowLayout, 尊重首选尺寸。如果未通过覆盖getPreferredSize()

明确设置,则绘图面板的首选大小为0x0
@Override
public Dimension getPreferredSize() {
    return new Dimension( ... , ... );
}