Passing.getText() String to another class

awt, java, jtextfield, reflection, swing

Solution

I may help to review the prescribed initialization order in Java. In particular, the `textField` instance variable initializer should be complete by the time a valid `Class1` instance exists. One way to violate this order is to construct `Class1` and `Class2` on different threads. To preclude this, Swing GUI objects should be constructed and manipulated only on the event dispatch thread, as shown in the sscce below.

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/** @see http://stackoverflow.com/q/10067399/230513 */
public class NewJavaGUI extends JPanel {

    public NewJavaGUI() {
        Class1 class1 = new Class1();
        Class2 class2 = new Class2(class1);
        this.add(class1.textField);
        this.add(new JLabel(class2.s));
    }

    private static class Class1 extends Object {

        private final JTextField textField = new JTextField("Something");

        public Class1() {} // implicit

        public String getTextFieldString() {
            return textField.getText();
        }
    }

    private static class Class2 extends Object {

        private final Class1 c1;
        private final String s;

        public Class2(Class1 class1) {
            c1 = class1;
            s = c1.getTextFieldString();
        }
    }

    private void display() {
        JFrame f = new JFrame("NewJavaGUI");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NewJavaGUI().display();
            }
        });
    }
}

Problem

I'm currently working on a first year university project and I have a problem, although I doubt it's a very complicated one, but I've been searching and I just can't find a suitable answer to it. The problem concerns two classes. A gui class (class1) and another class (class2), when I run the code the second class gives me a nullpointerexception when trying to retrieve the getText() String in class2 from class1. I have a JTextField in class1 and am trying to pass through the .getText() value to class2 and store it in a String type variable. The current code I'm trying to achieve this with is the following (simplified): ``` public class Class1 { private JTextField textField = new JTextField("Something"); public Class1() {} ... public String getTextFieldString() { return textField.getText(); } } public class Class2 { public Class2(Class1 class1) { c1=class1 } private c1 Class1 = new Class1(); private String s = new String(); ... s = c1.getTextFieldString(); } ``` I'm pretty new to coding, I've read that maybe I need to pass through an argument somewhere and I assume that's because textField is not static in itself, it changes when somebody enters a new value. (sorry for stating the obvious there.) Anyway, help is appreciated. Thanks a lot!

Original source