使用边框布局的JPanel定位不起作用

时间:2013-12-21 21:22:09

标签: java swing jpanel jlabel border-layout

我正在尝试使用JPaneli.add(jp, BorderLayout.EAST);的位置设置为右侧,但它无效。有什么想法吗?感谢您的帮助。

/* INSTANCE DECLARATIONS */
private JTextField tf;//text field instance variable
private JLabel jl2;//label instance variable


/*****************
 * WINDOW METHOD *
 * ***************/
public void window() {

    LoadImageApp i = new LoadImageApp();//calling image class

    JFrame gameFrame = new JFrame();//declaration
    JPanel jp = new JPanel();
    JLabel jl = new JLabel("Enter a Letter:");//prompt with label

    tf = new JTextField(1);//length of text field by character
    jl2 = new JLabel("Letters Used:    ");

    jp.add(jl);//add label to panel
    jp.add(tf);//add text field to panel
    jp.add(jl2);//add letters used

    gameFrame.add(i); //adds background image to window
    i.add(jp, BorderLayout.EAST); // adds panel containing label to background image panel

    gameFrame.setTitle("Hangman");//title of frame window
    gameFrame.setSize(850, 600);//sets size of frame
    gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//exit when 'x' button pressed
    gameFrame.setIconImage(new ImageIcon("Hangman-Game-grey.png").getImage());//set the frame icon to an image loaded from a file
    gameFrame.setLocationRelativeTo(null);//window centered
    gameFrame.setResizable(false);//user can not resize window
    gameFrame.setVisible(true);//display frame


 }//end window method

1 个答案:

答案 0 :(得分:5)

您的i实例使用的LoadImageApp布局管理器使用什么?我打赌它不是BorderLayout。我打赌LoadImageApp类扩展JPanel如果是这样,如果你从未明确设置其布局,那么它默认使用FlowLayout,当你发现时, FlowLayout不尊重BorderLayout.EAST int常量。

解决方案可能非常简单:使用BorderLayout

setLayout(new BorderLayout());

修改
您在评论中说明:

  

当我将i的边框布局设置为EAST时,我的背景图像也会向右移动,有没有办法绕过它?

不,你错过了这一点。您需要将LoadImageApp的布局设置为BorderLayout。你不应该添加我的BorderLayout.EAST。这从未被推荐给你。

即,

public class LoadImageApp extends JPanel {

  // in the constructor
  public LoadImageApp() {
    setLayout(new BorderLayout());
  }

  // .... etc....
}

LoadImageApp实例(我将其命名为loadImageApp,而不是i)应该添加BorderLayout.CENTER,这是您之前所做的。请阅读布局管理器教程,您可以找到here