java - 处置不工作

标签 java swing nullpointerexception jframe dispose

我正在重新编程我的旧登录屏幕代码之一,并且我正在更改:

JPasswordField.getText(); 

致:

JPasswordFieald.getPassword();

这要困难得多,因为它输出字符。

无论如何,JFrame.dispose() 不适合我。我希望我的程序将旧的 JFrame 处理为新的 JFrame(例如 JFrame2)。

这是我的代码:

public class Launcher {

    //Define Variables
    public static String VER = "1.1.0";
    public static String STATE = " ALPHA ";
    public static JFrame launcher;
    public static char[] sPass;
    public static String sUser;

    //Create widgets
    public static JTextField User = new JTextField();
    public static JPasswordField Pass = new JPasswordField();
    public static JButton Login = new JButton("Login");

    //Runs when program starts
    public static void main(String[] args) {
        NewFrame("Infinite Doom Launcher");

        //Checks if login has been pressed
        Login.addActionListener(new ActionListener(){

             public void actionPerformed(ActionEvent e){
                 sUser = User.getText();
                 sPass = Pass.getPassword();

                 //checks if password is correct
                 if(CheckPass(sPass)) {
                     if(sUser.equals("genfy")){
                        Game.main(null);
                        launcher.dispose();
                     }
                 }
             }
        });

    }

    //Creates new frame
    public static void NewFrame(String Name) {
        JFrame launcher = new JFrame(Name + " " + STATE + VER);
        launcher.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        launcher.setSize(500,95);
        launcher.setResizable(false);

        //Add widgets to a Border Layout
        launcher.setLayout(new BorderLayout());
        launcher.add(User, BorderLayout.NORTH);
        launcher.add(Pass, BorderLayout.CENTER);
        launcher.add(Login, BorderLayout.SOUTH);

        //Set visible
        launcher.setVisible(true);
    }

    //Checks if the entered password is correct
    private static boolean CheckPass(char[] input) {
        boolean isCorrect = true;
        char[] correctPassword = { 'g', 'e', 'n', 'f', 'y', 'g', 'e', 'n', 'y', 's' };

        if (input.length != correctPassword.length) {
            isCorrect = false;
        } else {
            isCorrect = Arrays.equals (input, correctPassword);
        }

        //Zero out the password.
        Arrays.fill(correctPassword,'0');

        return isCorrect;
    }
}

所以问题似乎发生在:

             //checks if password is correct
             if(CheckPass(sPass)) {
                 if(sUser.equals("genfy")){
                    Game.main(null);
                    launcher.dispose();
                 }

具体来说:

launcher.dispose();

因此,当我按 JButton(登录)时,会出现此错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at main.Launcher$1.actionPerformed(Launcher.java:42)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source) 

对于我的代码太长,我深表歉意。

最佳答案

这一行的 NewFrame 方法似乎存在范围问题:

JFrame launcher = new JFrame(Name + " " + STATE + VER);

launcher变量是NewFrame方法的本地变量,并且隐藏launcher类成员。因此,当您在 actionPerformed() 方法中调用 launcher.dispose() 时,您会得到一个 NullPointerException。要解决这个问题,您应该进行以下更改:

launcher = new JFrame(Name + " " + STATE + VER);

另请查看此主题:The Use of Multiple JFrames, Good/Bad Practice?

离题

正如 @kleopatra 所建议的,了解 Java 命名约定并遵守它们。请参阅本文档的更多内容:Java Code Conventions

关于java - 处置不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21078049/

相关文章:

java - 二叉搜索树父指针

java - java 8 中澳大利亚/墨尔本时区的日期时间日光节约问题

java - Container.getComponents() 是否返回对原始组件的引用?

java - System object 可能抛出空指针异常的场景有哪些?

java - 什么是NullPointerException,我该如何解决?

java - 使用不同的变量类型进行计算

Java 类型不匹配 : cannot convert from java. lang.Object

java - Java 中的关键事件 - 初学者帮助

java - 扩展类如何向父类(super class)框架添加按钮?

java - 什么是 NullPointerException,我该如何解决?