【发布时间】:2020-06-25 16:47:44
【问题描述】:
我正在使用 Java8,我正在尝试使用代码从一帧移动到另一帧。
问题: 第一个 JPanel 没有关闭 当我尝试关闭窗口时,第二个 JPanel 出现错误
错误信息:
线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException 在 ex2.Main2$2.actionPerformed(Main2.java:60) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.Component.processMouseEvent(Component.java:6539) 在 javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 在 java.awt.Component.processEvent(Component.java:6304) 在 java.awt.Container.processEvent(Container.java:2239) 在 java.awt.Component.dispatchEventImpl(Component.java:4889) 在 java.awt.Container.dispatchEventImpl(Container.java:2297) 在 java.awt.Component.dispatchEvent(Component.java:4711) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535) 在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) 在 java.awt.Container.dispatchEventImpl(Container.java:2283) 在 java.awt.Window.dispatchEventImpl(Window.java:2746) 在 java.awt.Component.dispatchEvent(Component.java:4711) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) 在 java.awt.EventQueue.access$500(EventQueue.java:97) 在 java.awt.EventQueue$3.run(EventQueue.java:709) 在 java.awt.EventQueue$3.run(EventQueue.java:703) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) 在 java.awt.EventQueue$4.run(EventQueue.java:733) 在 java.awt.EventQueue$4.run(EventQueue.java:731) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:730) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
请帮忙。
第一帧:
public class ex2 {
private JFrame frmLogin;
private JTextField textField;
private JPasswordField passwordField;
//cuted the methods to start the frame
private void initialize() {
frmLogin = new JFrame();
frmLogin.getContentPane().setFont(new Font("Dialog", Font.BOLD, 18));
frmLogin.setTitle("Login");
frmLogin.setBounds(100, 100, 400, 300);
frmLogin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmLogin.getContentPane().setLayout(null);
JLabel lblUserName = new JLabel("Username");
lblUserName.setBounds(130, 40, 150, 15);
lblUserName.setFont(new Font("Dialog", Font.BOLD, 18));
frmLogin.getContentPane().add(lblUserName);
JLabel lblPassword = new JLabel("Password");
lblPassword.setBounds(130, 100, 150, 15);
lblPassword.setFont(new Font("Dialog", Font.BOLD, 18));
frmLogin.getContentPane().add(lblPassword);
textField = new JTextField();
textField.setBounds(130, 70, 150, 19);
textField.setFont(new Font("Dialog", Font.BOLD, 18));
frmLogin.getContentPane().add(textField);
textField.setColumns(10);
passwordField = new JPasswordField();
passwordField.setBounds(130, 130, 150, 19);
passwordField.setFont(new Font("Dialog", Font.BOLD, 18));
frmLogin.getContentPane().add(passwordField);
JButton btnLogin = new JButton("Login");
btnLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String user = textField.getText();
String pass = String.copyValueOf(passwordField.getPassword());
if (user.equals("Rod") && pass.equals("123")) {
Main2 segundo = new Main2();
segundo.setVisible(true);
ex2.setVisible(false);
}
}
});
btnLogin.setBounds(130, 190, 150, 25);
btnLogin.setFont(new Font("Dialog", Font.BOLD, 18));
frmLogin.getContentPane().add(btnLogin);
}
第二帧
public class Main2 extends JFrame {
private JPanel contentPane;
private static Main2 frame2;
public Main2() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 400, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblEntramos = new JLabel("Entramos");
lblEntramos.setFont(new Font("Dialog", Font.BOLD, 22));
lblEntramos.setBounds(150, 100, 200, 15);
contentPane.add(lblEntramos);
JButton btnSair = new JButton("Sair");
btnSair.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
frame2.setVisible(false);
}
});
btnSair.setBounds(125, 175, 150, 25);
contentPane.add(btnSair);
}
}
【问题讨论】:
-
当您向 Stack Overflow 发帖抱怨一些错误时,包含错误消息会很有帮助。请编辑您的问题以包含错误消息并提供有关 Main2、ex2 和 frame2 的详细信息。您建议它们是 JPanel,但您以暗示它们是 JFrame 的方式命名它们。
-
1) 请参阅The Use of Multiple JFrames, Good/Bad Practice? 2) 尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。 3) 总是复制/粘贴错误和异常输出!
-
如何关闭
JPanel? -
看来您正在尝试编写一个 Swing 应用程序,该应用程序首先显示“登录”对话框,用户成功登录后,应用程序应关闭登录对话框并显示“主”应用程序窗口。这是正确的吗?