user1898552
user1898552

Reputation: 11

JTextField not working

I'm trying to store the user input into a global static variable by using the getText() method.

userinput is the JTextField, which is initialized in createContentPane()

I created an accessor method getText() to get the user input from the JTextField and store it in the static variable named words, but I am getting an error message.

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;
    }
}

Upvotes: 0

Views: 2571

Answers (3)

Sri Harsha Chilakapati
Sri Harsha Chilakapati

Reputation: 11940

You're creating the frame wrong. If you've made the class extend the JFrame then there's no point in creating a new JFrame. Change the class to

public class Ceaser_Cipher extends JFrame implements ActionListener
{

    // remove the keyword 'static' from the variables. it's not necessary.
    private JLabel titleLabel;
    private JTextField userinput;
    private JTextArea resultTA;
    private JButton runButton, homeButton;
    private String words;
    private int key = 5;
    private String cipherd;
    private String decipherd;

    // constructor.
    public Ceaser_Cipher()
    {
        // this class extends a JFrame. so you can call it's methods directly
        // and you do not need to create the frame again.

        super("[=] Ceaser_Cipher [=]");
        setCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 600);

        // set the content pane to the panel returned by your method.
        setContentPane(createContentPane());

        // avoid calculations in the main method. you may place them here.
        key = random();
        words = userInput.getText();
        cipherd = encrpt(words, key);
        decipherd = decrpt(cipherd, key);

        setVisible(true);
    }

    // Your createContentPane method. it's fine. copy it here.
    // Your actionPerformed method is also fine. copy it here.

    // And finally the main method.
    public static void main(String[] args)
    {
        // This calls the constructor and everything will be fine.
        new Ceaser_Cipher();
    }

}

Upvotes: 1

Reimeus
Reimeus

Reputation: 159754

The JTextField userinput has not been initialized when getText is called (as it is due to be initialized in the EDT) resulting in an NullPointerException on this line

String word = userinput.getText();

Create the UI and retrieve the text in the EDT.

Here are the list of don't:

  • Don't use static variables in an OO language such as Java.
  • Don't use package names that start with an uppercase letter. Java naming conventions use lowercase for package names.
  • Don't extend JFrame, create an instance and use instead
  • Don't use absolute positioning (null layout), use a layout manager instead

Upvotes: 2

pinkpanther
pinkpanther

Reputation: 4798

The problem is:

Your words = getText(); method is called before the instantiation of userinput, JTextField. Since, it is null by the time, you are getting NullPointerException.

Upvotes: 1

Related Questions