我怎样才能访问其他 class 只是为了获取信息然后在 main 中进行更改?
How can I access other class just to get info and then change in main?
我有一个名为 getCrop() 的函数,以便根据设置更改标签的 img window 但是当我在另一个 class 中调用该函数时,img 没有改变,为什么?
private JLabel label_9 = new JLabel("");
//This is inside class Normal(main).
public void getCrop(String str) {
switch(str) {
case "4446" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4446.jpg")));
break;
case "3339" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3339.jpg")));
break;
case "3446" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3446.jpg")));
break;
case "4536" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4536.jpg")));
break;
case "5346" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/5346.jpg")));
break;
case "11115" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/11115.jpg")));
break;
case "4437" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4437.jpg")));
break;
case "3447" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3447.jpg")));
break;
case "4347" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4347.jpg")));
break;
case "3546" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3546.jpg")));
break;
case "4356" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4356.jpg")));
break;
case "5436" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/5436.jpg")));
break;
default : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4446.jpg")));
break;
}
}
我的目标是能够通过我的设置更改 img window
这是当有人更改 comboBox 时 img 也应该更改的代码。
//City is an array of Strings
public JComboBox comboBox = new JComboBox(City);
comboBox.addActionListener(new ActionListener() {
//this is inside Settings
public void actionPerformed(ActionEvent e) {
Normal cb = new Normal();
System.out.println(comboBox.getSelectedItem());
cb.getCrop(comboBox.getSelectedItem().toString());
}
});
编辑 1:
我用 setVillageImg tanks 替换了 getcrop 作为 tip
public static void setVillageImg(String str) {
label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/" + str + ".jpg")));
}
编辑 2:
现在可以访问了,谢谢大家。
但是当我第一次更改它时它有效但我必须关闭设置并再次打开才能再次更改 img 因为如果我再次尝试更改它会给我一个错误
at java.awt.EventDispatchThread.run(Unknown Source)
普通 cb 范围仅限于我认为的 actionPerformed 方法和您创建的新 Normal 对象。您需要在框架内的标签上调用 getcrop()/框架中已经创建的 Normal 对象,无论它在哪里。
看来您的问题是您创建了 Normal
class 的新实例,然后它改变了与您看到的不同的标签图像。您可以通过传递东西或使方法静态来解决这个问题;但是当您可以使用其他机制时,这会给代码增加不必要的依赖性。
如果你有两个 classes(每个设置和主视图一个)为什么不在它们之间添加一个控制器并将其作为 JComboBox
和 Observable
到主视图?例如(代码包含要删除的模拟方法和语句):
主视图:
public class MainView extends JPanel implements Observer {
private JLabel label = new JLabel("");
public void setVillageImg(String path) {
// set the image
}
@Override
public void update(Observable o, Object arg) {
String path = (String)arg;
System.out.println(path);
setVillageImg(path);
}
}
控制器:
public class ViewController extends Observable implements ActionListener {
public ViewController(Observer observer) {
addObserver(observer);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Action Performed");
setChanged();
JComboBox comboBox = (JComboBox) e.getSource();
notifyObservers(comboBox.getSelectedItem().toString());
}
}
设置视图:
public class SettingsView extends JPanel {
private JComboBox<String> comboBox;
private static final String[] strings = {"Hello", "World"};
public SettingsView(ActionListener listener) {
comboBox = new JComboBox<>(strings);
comboBox.addActionListener(listener);
}
public void simComboChange(int selected) {
System.out.println("Simulating combo change");
comboBox.setSelectedIndex(selected);
comboBox.actionPerformed(new ActionEvent(comboBox, 0, "SimAction"));
}
}
模拟main
:
public static void main(String[] args) {
MainView mainView = new MainView();
ViewController viewController = new ViewController(mainView);
SettingsView settingsView = new SettingsView(viewController);
settingsView.simComboChange(0);
settingsView.simComboChange(1);
}
背景资料:
一个 Observer
是一个 class,它想要观察另一个 class 的变化并根据这些变化采取行动。
变化的class被称为Observable
。两者一起是模型-视图-控制器模式的机制。
setChanged()
changes the state of the observable to changed. If you call notifyObservers()
the observable should be checked for changes with hasChanged()
. clearChanged()
将状态设置回未更改。两者都会影响 hasChanged()
的 return 值。注意 clearChanged()
是由 notifyObservers()
自动调用的,在代码中是多余的;因此它现在被删除了。
我有一个名为 getCrop() 的函数,以便根据设置更改标签的 img window 但是当我在另一个 class 中调用该函数时,img 没有改变,为什么?
private JLabel label_9 = new JLabel("");
//This is inside class Normal(main).
public void getCrop(String str) {
switch(str) {
case "4446" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4446.jpg")));
break;
case "3339" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3339.jpg")));
break;
case "3446" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3446.jpg")));
break;
case "4536" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4536.jpg")));
break;
case "5346" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/5346.jpg")));
break;
case "11115" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/11115.jpg")));
break;
case "4437" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4437.jpg")));
break;
case "3447" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3447.jpg")));
break;
case "4347" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4347.jpg")));
break;
case "3546" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3546.jpg")));
break;
case "4356" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4356.jpg")));
break;
case "5436" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/5436.jpg")));
break;
default : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4446.jpg")));
break;
}
}
我的目标是能够通过我的设置更改 img window 这是当有人更改 comboBox 时 img 也应该更改的代码。
//City is an array of Strings
public JComboBox comboBox = new JComboBox(City);
comboBox.addActionListener(new ActionListener() {
//this is inside Settings
public void actionPerformed(ActionEvent e) {
Normal cb = new Normal();
System.out.println(comboBox.getSelectedItem());
cb.getCrop(comboBox.getSelectedItem().toString());
}
});
编辑 1:
我用 setVillageImg tanks 替换了 getcrop 作为 tip
public static void setVillageImg(String str) {
label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/" + str + ".jpg")));
}
编辑 2:
现在可以访问了,谢谢大家。 但是当我第一次更改它时它有效但我必须关闭设置并再次打开才能再次更改 img 因为如果我再次尝试更改它会给我一个错误
at java.awt.EventDispatchThread.run(Unknown Source)
普通 cb 范围仅限于我认为的 actionPerformed 方法和您创建的新 Normal 对象。您需要在框架内的标签上调用 getcrop()/框架中已经创建的 Normal 对象,无论它在哪里。
看来您的问题是您创建了 Normal
class 的新实例,然后它改变了与您看到的不同的标签图像。您可以通过传递东西或使方法静态来解决这个问题;但是当您可以使用其他机制时,这会给代码增加不必要的依赖性。
如果你有两个 classes(每个设置和主视图一个)为什么不在它们之间添加一个控制器并将其作为 JComboBox
和 Observable
到主视图?例如(代码包含要删除的模拟方法和语句):
主视图:
public class MainView extends JPanel implements Observer {
private JLabel label = new JLabel("");
public void setVillageImg(String path) {
// set the image
}
@Override
public void update(Observable o, Object arg) {
String path = (String)arg;
System.out.println(path);
setVillageImg(path);
}
}
控制器:
public class ViewController extends Observable implements ActionListener {
public ViewController(Observer observer) {
addObserver(observer);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Action Performed");
setChanged();
JComboBox comboBox = (JComboBox) e.getSource();
notifyObservers(comboBox.getSelectedItem().toString());
}
}
设置视图:
public class SettingsView extends JPanel {
private JComboBox<String> comboBox;
private static final String[] strings = {"Hello", "World"};
public SettingsView(ActionListener listener) {
comboBox = new JComboBox<>(strings);
comboBox.addActionListener(listener);
}
public void simComboChange(int selected) {
System.out.println("Simulating combo change");
comboBox.setSelectedIndex(selected);
comboBox.actionPerformed(new ActionEvent(comboBox, 0, "SimAction"));
}
}
模拟main
:
public static void main(String[] args) {
MainView mainView = new MainView();
ViewController viewController = new ViewController(mainView);
SettingsView settingsView = new SettingsView(viewController);
settingsView.simComboChange(0);
settingsView.simComboChange(1);
}
背景资料:
一个 Observer
是一个 class,它想要观察另一个 class 的变化并根据这些变化采取行动。
变化的class被称为Observable
。两者一起是模型-视图-控制器模式的机制。
setChanged()
changes the state of the observable to changed. If you call notifyObservers()
the observable should be checked for changes with hasChanged()
. clearChanged()
将状态设置回未更改。两者都会影响 hasChanged()
的 return 值。注意 clearChanged()
是由 notifyObservers()
自动调用的,在代码中是多余的;因此它现在被删除了。