为什么我的 JButton 中只有 1 个显示?
Why is only 1 of my JButtons showing?
我不明白为什么只有 "Log in to existing account" 是唯一显示的按钮。我只想显示 2 个按钮,但 "Create account" 没有显示,即使我将它的可见性设置为 true 并移动它以使其不与 "Login to existing account" 重叠。
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();
}
}
您是否尝试过对包含 JButton 的面板使用不同的布局?
由于您有两个不同的面板,一个按钮位于登录面板的最顶部,另一个按钮位于注册面板的最底部。
相反,尝试将它们放在同一个面板中,一个在北方,另一个在中心。
很多问题:
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);
看看区别。根据需要调整约束。
我建议您阅读 Swing 教程中关于 Layout Manager 的部分以获得工作示例,以了解使用每个布局管理器的基础知识。
我不明白为什么只有 "Log in to existing account" 是唯一显示的按钮。我只想显示 2 个按钮,但 "Create account" 没有显示,即使我将它的可见性设置为 true 并移动它以使其不与 "Login to existing account" 重叠。
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();
}
}
您是否尝试过对包含 JButton 的面板使用不同的布局?
由于您有两个不同的面板,一个按钮位于登录面板的最顶部,另一个按钮位于注册面板的最底部。
相反,尝试将它们放在同一个面板中,一个在北方,另一个在中心。
很多问题:
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);
看看区别。根据需要调整约束。
我建议您阅读 Swing 教程中关于 Layout Manager 的部分以获得工作示例,以了解使用每个布局管理器的基础知识。