Объясните ошибку в логике 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 шт):
Дело в том, что вызывая метод экзепляра класса Forma, созданного в методе actionPerformed, вы никак не влияете на состояние объекта, на который указывает поле f объекта, на который указывает переменная con.
Надо разделять переменные, которые являются только контейнерами для объектов и сами созданные объекты. Начиная с простых вещей, к примеру внизу есть класс 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(), не более.