Объясните ошибку в логике JAVA

Есть JtextField Получаю из него значение по нажатию на Jbutton и передаю в метод setter, для дальнейшего извлечения

btnwheat.addActionListener(new ActionListener() {
        Connection con = new Connection();
        public void actionPerformed(ActionEvent e) {
               Forma f = new Forma();
               f.setnumber(number_text.getText());

методы установки и получения

public void setnumber(String number) { this.number = number;}
public String getnumber() { return number; }

все отлично, на данных этапах number хранит нужное мне значение. В том же обработчике нажатия кнопки, где я присваиваю нужные значения, я запускаю метод из другого класса. conn.Quality();

А вот в этом методе, уже мое значение равняет null. Получаю его след. образом.

f.getnumber()

Почему значение не сохранятся или я не так вызываю? Полный код ниже

     btnwheat.addActionListener(new ActionListener() {
        Connection con = new Connection();
        public void actionPerformed(ActionEvent e) {
               Forma f = new Forma();
               f.setNumber(number_text.getText());
            
            
              con.Quality();
              
        }
    });

Класс с хранением переменных

  public class Forma {
private String number;


public void setnumber(String number) { this.number = number;}
public String getnumber() { return number; }

и конечный метод

 public void Quality() {
        try {
        
        java.sql.Connection connection = cpds.getConnection();

        PreparedStatement stUpdate = connection.prepareStatement();

        stUpdate.setString(1, f.getnumber());
        stUpdate.executeUpdate();

        st = connection.prepareStatement();

        st.setString(1, f.getnnumber());
        
        st.executeUpdate();

        
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    } catch (SQLException e) {
        System.out.println("Не смогли обновить показатели: " + e);
        Main.failed();
    }

}

Класс Connection

 public class Connection {

static ComboPooledDataSource cpds;

 public static java.sql.Connection conPool() throws SQLException {
    cpds = new ComboPooledDataSource();
    try {
        cpds.setDriverClass("com.mysql.cj.jdbc.Driver");
        cpds.setJdbcUrl(
                "");
        cpds.setUser("dbLogin");
        cpds.setPassword("dbPassword");

        Properties properties = new Properties();
        properties.setProperty("user", "");
        properties.setProperty("password", "");
        properties.setProperty("useUnicode", "true");
        properties.setProperty("characterEncoding", "UTF8");
        cpds.setProperties(properties);

        
        cpds.setMaxStatements(180);
        cpds.setMaxStatementsPerConnection(180);
        cpds.setMinPoolSize(10);
        cpds.setAcquireIncrement(10);
        cpds.setMaxPoolSize(30);
        cpds.setMaxIdleTime(30);

    } catch (PropertyVetoException e) {
        e.printStackTrace();
    }
    return cpds.getConnection();

}

  public void carQuality() {
    Forma47 f47gs = new Forma47();

    try {
        
        java.sql.Connection connection = cpds.getConnection();

        PreparedStatement stUpdateQual = connection.prepareStatement(
                );

        stUpdateQual.setString(1, f47gs.getNumber());
        stUpdateQual.executeUpdate();

        stQuality = connection.prepareStatement();

        stQuality.setString(1, f47gs.getCulture());
        stQuality.setString(2, f47gs.getcLass());
        stQuality.setString(3, f47gs.getweight());
        stQuality.setString(4, f47gs.getcolor());
        stQuality.setString(5, f47gs.getsmell());
    
        stQuality.executeUpdate();

    
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    } catch (SQLException e) {
        
    }

}

Ответы (2 шт):

Автор решения: Alexandr Ivanov

Дело в том, что вызывая метод экзепляра класса Forma, созданного в методе actionPerformed, вы никак не влияете на состояние объекта, на который указывает поле f объекта, на который указывает переменная con.

→ Ссылка
Автор решения: Alex Krass

Надо разделять переменные, которые являются только контейнерами для объектов и сами созданные объекты. Начиная с простых вещей, к примеру внизу есть класс Forma и для него создаются три разных переменные с объектами. В каждом переменной свой собственный объект.

Класс формы:

public class Forma {
    private String number;

    public void setNumber(String number) { this.number = number; }
    public String getNumber() { return number; }
}

Код Main:

public static void main(String[] args) {
    Forma a = new Forma();
    Forma b = new Forma();
    Forma c = new Forma();

    a.setNumber("10");
    b.setNumber("20");
    c.setNumber("30");

    System.out.println(a.getNumber() + "; " + b.getNumber()  + "; " + c.getNumber());
}

Вывод будет 10; 20; 30, что говорит о том, что это разные объекты. Но иногда объекты можно передавать переменным в виде ссылки.

public static void main(String[] args) {
    Forma a = new Forma();
    Forma b = a;

    a.setNumber("10");
    System.out.println(a.getNumber() + "; " + b.getNumber());

    b.setNumber("20");
    System.out.println(a.getNumber() + "; " + b.getNumber());
}

Вывод уже будет 10; 10 и 20; 20 - поскольку мы работаем с одним и тем же объектом, ссылка на который хранится в разных переменных. Иногда переменные могут перекрываться и иметь одинаковые имена.

public class Main {
    public static void main(String[] args) {
        new Main().Start();
    }

    private Forma forma = new Forma();

    private void Start() {
        Forma forma = new Forma();
        forma.setNumber("10");

        System.out.println(forma.getNumber() + "; " + this.forma.getNumber());
    }
}

Вывод будет 10; null, поскольку здесь у нас две переменные с одним именем и два разных объекта в этих переменных. Один является полем private Forma forma = new Forma();, а вот второй является локальной переменной Forma forma = new Forma();. Причем локальная переменная закрывает видимость внешней, поэтому обратиться к внешней можно только через this.

Внимательно изучите логику примеров выше.

Примерно так же у вас в коде и выходит - вы создаете два разных объекта, которые не связаны между собой никак, кроме как названием класса. Поэтому вместо того, чтобы создавать новый объект, передавайте в метод созданный.

btnwheat.addActionListener(new ActionListener() {
    Connection con = new Connection();
    public void actionPerformed(ActionEvent e) {
        Forma f = new Forma();
        f.setNumber(number_text.getText());
                    
        con.Quality(f); //! передаем внутрь наш созданный объект 
    }
});

Ну и сам код Connection подправить:

public void carQuality(Forma f) {
    System.out.println(f.getNumber()); //! используем переданный объект
}

В общем вам надо четко понимать, что такое переменная (контейнер для объектов). Что такое объект. И что класс является просто описанием того, как будет выглядеть объект после вызова new Class(), не более.

→ Ссылка