Как изменить значение переменной во внешнем классе, если оно изменилось во внутреннем классе?
У меня есть свинг-класс, который включает в себя строковую переменную str3, объявленную как final и два
Интерфейсы ActionListener, которые реализованы двумя JButtons b1
и b2, когда нажата кнопка b1 JButton str3 String принимает значение,
Мой вопрос здесь, как сделать так, чтобы значение str3 изменялось в классе
скорее во втором интерфейсе ActionListener (не только в первом внутреннем классе) .
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class mySwing extends JFrame {
JButton b1, b2;
public mySwing() {
final String str3;
JPanel panel = new JPanel();
b1 = new JButton("please click me first");
b2 = new JButton("please click me second");
final JTextField txt = new JTextField(" ");
panel.add(txt);
Container pane = getContentPane();
panel.add(b1);
panel.add(b2);
pane.add(panel);
str3 = new String();
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent acv) {
String input = "HelloWorld";
String str3 = new String(input.substring(0, 5));
txt.setText(str3);
}
});
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent acv) {
txt.setText(str3);
}
});
setVisible(true);
}
public static void main(String[] args) {
new mySwing();
}
}
3 ответа
Просто сделай str3
неконечная переменная экземпляра вашего внешнего класса mySwing
,
Кстати, не делай такие вещи, как new String(input.substring(0, 5))
результат input.substring(0, 5)
является строкой, поэтому вам не нужно создавать другую строку.
На основании вашего кода:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class mySwing extends JFrame {
JButton b1, b2;
String str3="";
public mySwing() {
JPanel panel = new JPanel();
b1 = new JButton("please click me first");
b2 = new JButton("please click me second");
final JTextField txt = new JTextField(" ");
panel.add(txt);
Container pane = getContentPane();
panel.add(b1);
panel.add(b2);
pane.add(panel);
str3 = new String();
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent acv) {
str3+=" (1)";
txt.setText(str3);
}
});
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent acv) {
str3+=" (2)";
txt.setText(str3);
}
});
setVisible(true);
}
public static void main(String[] args) {
new mySwing();
}
}
Ваша переменная str3 является окончательной, поэтому ее нельзя изменить.
внутри своего кода вы никогда не пытались его изменить, вы просто объявили новый str3 внутри вашего внутреннего класса ActionListener.
Ваш подход объявления переменной str3 как конечной верен. Однако в Java строки не могут изменить свое содержимое, поэтому вам придется сделать что-то другое. Некоторые идеи, с которыми я могу столкнуться:
- Вместо этого используйте StringBuffer и преобразуйте его в String с помощью метода toString(), где это необходимо.
- Используйте какой-либо другой POJO с геттером и сеттером для вашей строки, таким образом, POJO будет объявлен как окончательный, и содержимое может быть изменено через геттер и сеттер.
Надеюсь, что это поможет в качестве руководства, есть много других хороших подходов.