JButton保持在中心位置

时间:2016-02-29 14:13:48

标签: java swing user-interface

所以我正在使用外部和内部类来制作示例GUI。我做了两个内部课程。首先是父类,它是“第一个面板”第二个我创建了一个子类,它是“第二个面板”,我使用GridBagLayout添加JButton。我的问题是它不会移动到我想要的位置。我指定了我的gridx = 2和gridy = 1.但它不会移动。任何帮助将不胜感激!

public class Login extends JFrame{

mainPanel mainpanel = new mainPanel(); // I create a class object for mainPanel so I can set as ContentPane.

//Constructor
public Login(){
    setSize(500,400);
    setTitle("Login Sample");
    setVisible(true);
    setLocationRelativeTo(null);
    getContentPane().add(mainpanel);

    //Window Listener
    addWindowListener(new WindowAdapter(){
       public void windowClosing(WindowEvent e){
           System.exit(0);
       }//window Closing
       });
}
class mainPanel extends JPanel { //InnerClass

firstPanel firstpanel = new firstPanel();

//Constructor
public mainPanel(){
    setPreferredSize(new Dimension (500,400));
    setLayout(new BorderLayout());
    setBorder(BorderFactory.createLineBorder(Color.green, 3));
    add(firstpanel);
}

class firstPanel extends JPanel{

    //Create Button
    JButton loginButton = new JButton("Login");
    //Constraints
    GridBagConstraints loginConstraints = new GridBagConstraints();

    public firstPanel(){
        setLayout(new GridBagLayout());
        loginConstraints.gridx = 1;
        loginConstraints.gridy = 2;
        add(loginButton,loginConstraints);
    }
}

2 个答案:

答案 0 :(得分:2)

  

JButton保持位于中心的位置

你的JButton保持居中到框架中心的原因与内部类没有任何关系。每个容器(例如JPanel,JFrame)都有一个默认布局。

JPanel的默认布局是FlowLayout。在这种布局下,添加的所有组件将以线性方式排列成行,以尽可能地适合面板宽度。超过面板宽度的任何东西都将被推到下一行。 JPanel使用的流布局的默认对齐方式为FlowLayout.CENTER,这就是为什么当您只添加一个按钮时,它始终以自身为中心。

由于它具有控制组件定位的布局,因此尝试更改组件的位置可能会变得无用。

  

我的问题是它不会移动到我想要的位置。我指定了我的gridx = 2和gridy = 1.但它不会移动

如果您希望组件移动到您指定的特定位置,可以将布局设置为null(绝对定位)。但是,通过这样做,您必须设置手动添加的每个组件的位置。如果没有,组件甚至不会显示在框架中。

要将面板的布局设置为null,您可以这样做:

JPanel pnlMain = new JPanel();
pnlMain.setLayout(null);

要设置组件的位置,我们可以使用setBounds()

JButton btn = new JButton();
btn.setBounds(x, y, width, height); //set location and dimension

但是,将容器的布局设置为null会给您带来许多无法预料的问题。删除布局并且所有定位都是硬编码的,当您的程序在不同的系统和环境中使用时,您几乎没有控制权。用户的各种使用也会导致无法预料的问题(例如,当用户调整窗口大小时)。

答案 1 :(得分:1)

首先我要说的是,如果你只有一个组件并希望它居中,那么它易于使用BorderLayout并添加它(组件)" Center"到了父母。 GridbagLayout不是这样工作的,因为你没有gridx = 0和gridy = 0中的组件。网格是由里面的组件大小计算的。当你想用GridBagLayout做这件事时,你必须配置更多例如。

  

锚:   当组件小于其显示区域时使用,以确定放置组件的位置(在区域内)。有效值(定义为GridBagConstraints常量)是CENTER(默认值),PAGE_START,PAGE_END,LINE_START,LINE_END,FIRST_LINE_START,FIRST_LINE_END,LAST_LINE_END和LAST_LINE_START。

但我认为我想要做的事情要付出很多努力: https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html