【问题标题】:JButton keep position in the centerJButton 保持居中位置
【发布时间】:2016-02-29 23:51:30
【问题描述】:

所以我正在使用外部和内部类制作示例 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);
    }
}

【问题讨论】:

  • 您还没有指定您希望按钮在什么位置,或者它现在在什么位置。我的猜测是,如果您在 BorderLayout 的中间只有一个对象,它就会在中间居中。
  • 我已经使用 FIRST_LINE_START 指定了位置,但它没有移动到左上角。我错过了什么?谢谢。
  • @MiaLegaspi 每个发布的问题您只能接受一个解决方案。您可能会接受对您最有帮助的解决方案。
  • @user3437460 哦,我明白了。谢谢你的提示我会保留这个:)

标签: java swing user-interface


【解决方案1】:

JButton 保持居中

您的 JButton 始终以 Frame 的中心为中心的原因与内部类无关。每个容器(例如 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 可能会给您带来许多无法预料的问题。随着布局被删除并且所有定位都被硬编码,当您的程序在不同的系统和环境中使用时,您几乎没有控制权。用户的各种使用也可能导致无法预料的问题(例如,当用户调整您的窗口大小时)。

【讨论】:

  • 我认为这是我使用的最佳方法。这对我来说更清楚。非常感谢!
【解决方案2】:

首先我想说的是,如果您只有一个组件并希望它居中,那么它易于使用 BorderLayout 并将其(组件)“居中”添加到父级。 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

【讨论】:

  • 我正在尝试使用这个 GridBagLayout。我想做的就是把它放在左上角。使用锚点 = GridBagConstraints.FIRST_LINE_START。但还是在中间?我错过了什么?谢谢
  • 我看到的一件事是您忘记传递 BorderLayout 的约束 -> add(firstPanel,"Center")
  • 另一件事是,您的内部面板没有大小,所以我建议它与内容的大小相同。要调试,我建议您为组件设置 backgroundColors,以便检查所有组件的预期布局行为
  • 它已经工作了我将 weightx 和 y 设置为 0.5;按钮的位置已经移动。谢谢!
猜你喜欢
  • 2017-04-10
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多