java - JTextField 不工作

标签 java swing nullpointerexception jtextfield

我尝试使用 getText() 方法将用户输入存储到全局静态变量中。

userinput 是 JTextField,它在 createContentPane() 中初始化

我创建了一个访问器方法getText()来从JTextField获取用户输入并将其存储在名为words的静态变量中,但我收到一条错误消息.

package Windows;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Ceaser_Cipher extends JFrame implements ActionListener
{
    private static JLabel titleLabel;
    private static JTextField userinput;
    private static JTextArea resultTA;
    private static JButton runButton, homeButton;
    private static String words;
    private static int key = 5;
    private static String cipherd;
    private static String decipherd;


    public static void createAndShowGUI()
    {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("[=] Ceaser_Cipher [=]");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 600);
        frame.setVisible(true);

        Ceaser_Cipher GUI = new Ceaser_Cipher();
        frame.setContentPane(GUI.createContentPane());
    }

    public JPanel createContentPane()

    {
        JPanel totalGUI = new JPanel();
        totalGUI.setLayout(null);

        JPanel titlepanel = new JPanel();
        titlepanel.setBackground(Color.pink);
        titlepanel.setLayout(null);
        titlepanel.setLocation(0, 0);
        titlepanel.setSize(500, 150);
        totalGUI.add(titlepanel);

        titleLabel = new JLabel("WELCOME to Ceaser's Cipher!!!!");
        titleLabel.setLocation(0, 0);
        titleLabel.setSize(500, 140);
        titleLabel.setHorizontalAlignment(0);
        titlepanel.add(titleLabel);

        JPanel textpanel = new JPanel();
        textpanel.setBackground(Color.red);
        textpanel.setLayout(null);
        textpanel.setLocation(0, 150);
        textpanel.setSize(500, 150);
        totalGUI.add(textpanel);

        userinput = new JTextField("Enter the word you want to ENCRYPT");
        userinput.setHorizontalAlignment(2);
        userinput.setLocation(100, 0);
        userinput.setSize(300, 140);
        textpanel.add(userinput);

        JPanel resultpanel = new JPanel();
        resultpanel.setBackground(Color.yellow);
        resultpanel.setLayout(null);
        resultpanel.setLocation(0, 300);
        resultpanel.setSize(500, 150);
        totalGUI.add(resultpanel);

        resultTA = new JTextArea();
        resultTA.setLocation(50, 0);
        resultTA.setSize(400, 140);
        resultpanel.add(resultTA);

        JPanel buttonpanel = new JPanel();
        buttonpanel.setBackground(Color.green);
        buttonpanel.setLayout(null);
        buttonpanel.setLocation(0, 450);
        buttonpanel.setSize(500, 200);
        totalGUI.add(buttonpanel);

        runButton = new JButton("RUN!");
        runButton.setLocation(200, 10);
        runButton.setSize(100, 30);
        runButton.addActionListener(this);
        buttonpanel.add(runButton);

        homeButton = new JButton("HOME!");
        homeButton.setLocation(200, 50);
        homeButton.setSize(100, 30);
        homeButton.addActionListener(this);
        buttonpanel.add(homeButton);

        totalGUI.setOpaque(true);
        return totalGUI;
    }

    public void actionPerformed(ActionEvent evt)
    {
        Object src = evt.getSource();
        if (src == runButton)
        {
            resultTA.setText("\n" + "The ENCRYPTION key generated is " + key + "\n" + "ENCRYPTED text is " + cipherd
                    + "\n" + "DECRYPTED text is " + decipherd);
        }
        if (src == homeButton)
        {

        }
    }

    public static void main(String[] args) 
    {
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowGUI();
                }
            });
        }


        key = random();
        words = getText();
        cipherd = encrpt(words, key);
        decipherd = decrpt(cipherd, key);
    }



    private static String getText() 
    {
        String word = userinput.getText();

        return word;
    }

    public static String encrpt(String text, int key)
    {
        //Array containing all the alphabetical characters.
                char alphabets [] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
                        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
                        'U', 'V', 'W', 'X', 'Y', 'Z'};

                //Array where the user's String will be inserted into and replaced with the ENCRYPTED characters.
                char plain [] = words.toUpperCase().toCharArray();
                //ENCRYPTION loop here, replaces the characters in the users String with the shifted alphabets based on the ENCRYPTION key.
                for (int i = 0; i < plain.length; i++)
                {
                    for (int j = 0; j < alphabets.length; j++)
                    {
                        if(plain[i] == alphabets[j])
                        {
                            plain[i] = alphabets[(j + key) % 26];
                            break;
                        }
                    }
                }

                String cipher = String.valueOf(plain);
                return cipher;
    }

    public static String decrpt(String text, int key)
    {
        //Array containing all the alphabetical characters.
        char alphabets [] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
                'U', 'V', 'W', 'X', 'Y', 'Z'};
        char plain [] = words.toUpperCase().toCharArray();
        char cipherd [] = new char[100];
        //DECRYPTION loop here, gets the ENCRYPTED characters and replaces them with the original alphabets by reversing the ENCRYPTION key.
                for (int i = 0; i < plain.length; i++)
                {
                    for (int j = 0; j < alphabets.length; j++)
                    {
                        if(plain[i] == alphabets[j])
                        {
                            cipherd[i] = alphabets[(j - key + 26) % 26];
                            break;
                        }
                    }
                }

        String decipher = String.valueOf(cipherd);
        return decipher;    
    }

    public static int random()
    {
        //Random object created here.
        Random ran = new Random();
        //Random number between 1-3 is generated here.
        key = ran.nextInt(9) + 1;

        return key;
    }
}

最佳答案

调用 getText 时,JTextField userinput 尚未初始化(因为它应在 EDT) 导致此行出现 NullPointerException

String word = userinput.getText();

创建 UI 并检索 EDT 中的文本。

以下是不要的列表:

  • 不要在 Java 等 OO 语言中使用静态变量。
  • 不要使用以大写字母开头的包名称。 Java 命名约定使用小写作为包名称。
  • 不要扩展 JFrame,而是创建一个实例并使用
  • 不要使用绝对定位(null 布局),而使用布局管理器

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

相关文章:

内存泄漏的java堆和线程分析

java - 如何在 @RestController 中仅覆盖 1 个 Http 方法 (POST),但让 Spring 使用标准 HATEOAS 响应处理所有其他 Http 方法

java - 如何替换 String 对象中的所有正则表达式字符串?

java - 为什么这个 Swing 登录表单显示错误?

java - 为什么setLayout方法不能与JPanel的ArrayList一起使用

java - 空指针异常变量

java - TreeMap中的这个空指针异常是不是并发访问导致的?

java - 加载 JNI 库时出现 Unsatisfied Link 错误

java - 用java编码后回车键不起作用

java - 将枚举转换为迭代器