为什么我的JButton中只有一个显示?

时间:2017-04-26 19:24:14

标签: java user-interface jbutton

我不明白为什么只有"登录现有帐户"是唯一显示的按钮。我只需要显示2个按钮,然后创建帐户"即使我将其可见性设置为true并将其移动,因此它也不会显示,因此它不会与"登录到现有帐户"重叠。

public class HotelBookingSystem extends JFrame
{
Container con;
public HotelBookingSystem()
{
    super("Booking System");
    JFrame mainWindow = new JFrame("Booking");
    mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainWindow.setSize(350,400);
    mainWindow.setVisible(true);

    con = getContentPane();
    BorderLayout myLayout = new BorderLayout();
    con.setLayout(myLayout);

    JButton login = new JButton ("Login to existing account");
    JButton register = new JButton ("Create Account");
    JPanel loginPanel = new JPanel();
    JPanel registerPanel = new JPanel();

    loginPanel.add(login, BorderLayout.NORTH);
    registerPanel.add(register, BorderLayout.SOUTH);
    login.setSize(350, 100);
    register.setSize(350, 100);

    loginPanel.setVisible(true);
    registerPanel.setVisible(true);

    mainWindow.add(login);
    mainWindow.add(register);
    mainWindow.add(loginPanel);
    mainWindow.add(registerPanel);

    login.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
              mainWindow.setVisible(false);     
            }
        });

    register.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
              mainWindow.setVisible(false);     
            }
        });
}

public static void main(String[] args) 
{
    HotelBookingSystem dataBaseAccess = new HotelBookingSystem();
}

}

2 个答案:

答案 0 :(得分:0)

您是否尝试为包含JButtons的面板使用不同的布局?

由于您有两个不同的面板,一个按钮位于loginPanel的最顶部,另一个按钮位于registerPanel的最底部。

相反,尝试将它们放在同一个面板中,一个位于NORTH,另一个位于CENTER中。

答案 1 :(得分:0)

许多问题:

mainWindow.setVisible(true);

在将所有组件添加到框架后,框架应该可见,因此这应该是构造函数中的最后一个语句。

con = getContentPane();
BorderLayout myLayout = new BorderLayout();
con.setLayout(myLayout);

JFrame内容窗格的默认布局管理器是BorderLayout,因此不需要此代码。

login.setSize(350, 100);
register.setSize(350, 100);

不要尝试设置组件的大小。布局管理器的工作是设置每个组件的大小和位置。

JPanel loginPanel = new JPanel();
JPanel registerPanel = new JPanel();

loginPanel.add(login, BorderLayout.NORTH);
registerPanel.add(register, BorderLayout.SOUTH);

为什么要创建两个面板?您只需将按钮直接添加到框架即可。

此外,JPanel的默认布局管理器是FlowLayout。因此,您不仅可以使用BorderLayout约束并期望它能够正常工作。

loginPanel.setVisible(true);
registerPanel.setVisible(true);

默认情况下,所有Swing组件(JFrame,JDialog等除外)都是可见的,因此上面的代码是不必要的。

mainWindow.add(login);
mainWindow.add(register);
mainWindow.add(loginPanel);
mainWindow.add(registerPanel);

如前所述,框架的默认布局是BorderLayout。如果未指定约束,则组件将转到“CENTER”。但是,一次只能在中心显示一个组件。

解决所有其他问题,然后尝试类似:

mainWindow.add(login, BorderLayout.NORTH);
mainWindow.add(register, BorderLayout.SOUTH);
mainWindow.add(loginPanel, BorderLayout.WEST);
mainWindow.add(registerPanel, BorderLayout.EAST);

看到差异。根据需要调整约束。

我建议您阅读Layout Manager上的Swing教程中有关工作示例的部分,以了解使用每个布局管理器的基础知识。