Java Swing跳转第二个JFrame窗口后自定义内容不显示问题求助
问题根因
你定义的LoginGUI1类存在双重JFrame定义的逻辑错误:
LoginGUI1本身已经继承了JFrame类,但类内部又额外声明了一个独立的JFrame frame成员变量- 所有控件(输入框、按钮、标签)全部添加到了内部的
frame对象上 - 你在跳转逻辑中调用
login.setVisible(true),是给继承得到的空LoginGUI1窗口设置可见,内部装了控件的frame对象从未被设置可见,所以只会显示空窗口。
解决方案
方案1:修改跳转调用逻辑(快速修复)
把LaunchGUI里Sign In按钮的点击事件代码修改为:
btnNewButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { LoginGUI1 login = new LoginGUI1(); // 调用内部带控件的frame的setVisible方法,而非LoginGUI1本身的 login.frame.setVisible(true); LaunchGUI.this.dispose(); } });
方案2:删除冗余的内部JFrame(推荐,符合Swing编码规范)
修改LoginGUI1类的代码,去掉额外的frame成员变量,所有控件直接添加到当前类(本身就是JFrame)上:
package GUI; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class LoginGUI1 extends JFrame{ private JTextField textField; private JPasswordField passwordField; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { LoginGUI1 window = new LoginGUI1(); window.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the application. */ public LoginGUI1() { initialize(); } /** * Initialize the contents of the frame. */ private void initialize() { // 直接设置当前类的属性,不需要额外创建frame this.setBounds(100, 100, 721, 526); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().setLayout(null); textField = new JTextField(); textField.setBounds(258, 236, 116, 22); this.getContentPane().add(textField); textField.setColumns(10); JButton btnLogin = new JButton("Login"); btnLogin.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); btnLogin.setBounds(258, 386, 97, 25); this.getContentPane().add(btnLogin); JLabel lblNewLabel = new JLabel("Username"); lblNewLabel.setBounds(157, 239, 68, 16); this.getContentPane().add(lblNewLabel); JLabel lblNewLabel_1 = new JLabel("Password"); lblNewLabel_1.setBounds(163, 301, 56, 16); this.getContentPane().add(lblNewLabel_1); passwordField = new JPasswordField(); passwordField.setBounds(258, 298, 116, 22); this.getContentPane().add(passwordField); } }
修改后原来的跳转逻辑不需要改动,直接调用login.setVisible(true)即可正常显示所有控件。
可选优化建议
- 尽量避免使用
null绝对布局,改用Swing自带的BorderLayout、FlowLayout、GridBagLayout等布局管理器,可适配不同分辨率和操作系统的显示效果。
内容的提问来源于stack exchange,提问作者Dark Load
相关产品推荐
相关产品推荐

