首先,我是 Java 的新手:/
我已经尝试自己解决这个问题大约 2 天了,但无法解决这个问题,问题是我正在尝试实现一个变量更改监听器。我曾尝试在我的项目中实现 Observer 和 Observable,但没有成功,但充其量也没有成功,我想出了将代码的一些元素包装到 while 循环中的方法,但失败了。
这是我的类(class),如果你看一下它,我在构造函数之后定义了一些全局变量,我需要监听所有这些全局变量的变化,如果有变化我想执行一个方法。
有人告诉我 JavaFX 有可以监听变量的方法,有人可以证实这一点吗? 无论如何,提前感谢您的帮助。
public class Tower_Controller {
public Tower_Controller() {
}
//Global variables
String isSelected = null;
int hasModules = 0;
int cap_s = 0;
int cpu_s = 0;
int cap = 0;
int cpu = 0;
int shield = 0;
int armor = 0;
double em = 00.00;
double th = 00.00;
double ki = 00.00;
double ex = 00.00;
public void invoke() {
Invoke_GUI runnable = new Invoke_GUI();
final JLabel tower_name = runnable.tower_name;
final JComboBox tower_select = runnable.tower_select;
final JTree module_browser = runnable.module_browser;
final JTree selected_modules = runnable.selected_modules;
final JProgressBar cap_bar = runnable.cap_bar;
final JProgressBar cpu_bar = runnable.cpu_bar;
final JLabel em_res = runnable.em;
final JLabel th_res = runnable.thermic;
final JLabel ki_res = runnable.kinetic;
final JLabel ex_res = runnable.explosive;
tower_select.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (isSelected != null) {
Events evt = new Events();
evt.towerSelected(isSelected);
} else {
tower_name.setText(tower_select.getSelectedItem().toString());
isSelected = tower_name.toString();
}
}
});
removeTower(tower_name);
runnable.setVisible(true);
}
public void updateValues(final JProgressBar cap_bar, final JProgressBar cpu_bar, final JLabel em_res,
final JLabel th_res, final JLabel ki_res, final JLabel ex_res){
cap_bar.setMaximum(cap);
cap_bar.setString(cap_s + " / " + cap);
cap_bar.setStringPainted(true);
cpu_bar.setMaximum(cpu);
cpu_bar.setString(cpu_s + " / " + cpu);
cpu_bar.setStringPainted(true);
String em_v = String.valueOf(em);
em_res.setText(em_v);
String th_v = String.valueOf(th);
th_res.setText(th_v);
String ki_v = String.valueOf(ki);
ki_res.setText(ki_v);
String ex_v = String.valueOf(ex);
ex_res.setText(ex_v);
}
public void updateList(final ArrayList<String> nodes, final JTree selected_modules) {
DefaultMutableTreeNode nod = new DefaultMutableTreeNode();
for (int i = 0; i < nodes.size(); i++) {
nod.add(new DefaultMutableTreeNode(nodes.get(i)));
}
selected_modules.setModel(new DefaultTreeModel(nod));
}
public void removeTower(final JLabel tower_name) {
tower_name.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
if (hasModules == 1 & isSelected != null) {
Events evt = new Events();
evt.towerHasModules();
} else if (isSelected == null) {
} else {
tower_name.setText("No Control Tower selected");
isSelected = null;
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
public JLabel setTowerName(JLabel a, String name) {
a.setText(name);
return a;
}
}
最佳答案
通知变量更改的一般过程如下:
- 首先,将变量设为私有(private)。
- 为每个变量创建两个方法,一个将它的值设置为一个参数(通常称为
setX()
,其中X
是变量名),另一个检索它的值 (getX()
) - 在任何需要读取或设置变量的地方,调用方法。
- 在
setX()
方法中,循环调用Observer
上的notifyObserver()
。
好了!现在每次更改变量时,都会通知已注册的 Observer
。该解决方案的关键部分是变量必须是私有(private)的,因此没有代码可以在不通过 setX()
方法的情况下设置它们的值。
关于Java - 监听变量变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514907/