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