JPanel位置问题

时间:2016-03-22 19:49:10

标签: java swing jframe location jpanel

我必须创建一个GUI,我真的想设置一个背景。 为了做到这一点,我创建了一个名为" Backround"我在哪里使用paintComponent方法。我把它想要在背景上设置的文件给它,它起作用了。

这是我的背景课程:

public class Background extends JPanel
{
    public void paintComponent(Graphics g)
    {
        try {
                Image img = ImageIO.read(new File("./fond.jpg"));
                g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
        } 

        catch (IOException e) {
        e.printStackTrace();
      } 
  }               
}

然而,一旦图像在背景上,我框架上的面板不再位于同一位置,我真的不知道如何解决这个问题,但仍然没有找到任何相关内容关于此的主题。

这是我的课程的引用,我在其中描述了GUI:

    this.setContentPane(new Background());

    this.setTitle("Arena");                                     
    this.setSize(800, 500);                                     
    this.setLocationRelativeTo(null);                           
    //this.setLayout(new FlowLayout(FlowLayout.CENTER));
    //this.setLayout(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        

    this.setVisible(true);                               


    // ******************************************** PANEL 1 ******************************************

    Panel P1 = new Panel();
    this.add("NORTH", P1);
    P1.setLayout(new FlowLayout());
    P1.add(new Label ("Joueur 1"));
    P1.add(new Label ("Action"));
    P1.add(new Label ("Joueur 2"));
    //P1.setVisible(true);


    // ********************************************* PANEL 2 ******************************************


    Panel P2 = new Panel();

    P2.setLayout(new FlowLayout());

    P2.add(Liste1);

    // Boutons
    Button B1 = new Button("FIGHT");
    P2.add(B1);
    Button B2 = new Button("HEAL");
    P2.add(B2);

    P2.add(Liste2);
    this.add("WEST", P2);
//  P2.setVisible(true);

此外,当我删除对Background构造函数的调用时,面板将返回其初始位置。

我希望你能帮助我或改变我的方向!

谢谢!

Antoine Sbert

1 个答案:

答案 0 :(得分:2)

  1. 确保在执行任何客户绘画之前致电super.paintComponent
  2. 不要在paint方法中加载资源(如图像),这会对程序的性能产生影响
  3. 默认情况下,
  4. JPanel使用FlowLayout,但在Background面板应用为contentPane后,您永远不会更改布局。调用setContentPane后,使用setLayout(new BorderLayout())或在类构造函数中应用布局(在加载图像的同时)
  5. 确保在建立基本用户界面
  6. 后,最后致电setVisible