對我來說,關鍵是你想改變一個字符串變量觸發GUI的變化。我看到要解決這個問題的最好方法是通過使用PropertyChangeListenerSupport使String變量成爲綁定屬性。通過這種方式,您可以讓GUI將PropertyChangeListener附加到包含String變量的類,然後在更改時通知您允許適當地更新GUI。
如果你走這條路線,考慮給觀察到的類一個SwingPropertyChangeSupport字段,以便在Swing事件線程上通知監聽者並希望避免任何Swing併發問題。
這裏有一個簡單的例子:
import java.awt.Dimension;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.event.SwingPropertyChangeSupport;
public class ShowPropertyChangeSupport {
@SuppressWarnings("serial")
private static void createAndShowGui() {
final MainGUI mainGui = new MainGUI("Title");
final ObservedClass observedClass = new ObservedClass();
observedClass.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent pcEvt) {
if (pcEvt.getPropertyName().equals(ObservedClass.BOUND_PROPERTY)) {
mainGui.setTitle(pcEvt.getNewValue().toString());
}
}
});
mainGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainGui.pack();
mainGui.setLocationRelativeTo(null);
mainGui.setVisible(true);
int timerDelay = 6000; // every 6 seconds
new Timer(timerDelay, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String result = JOptionPane.showInputDialog(mainGui,
"Please enter a String", "Set GUI title", JOptionPane.PLAIN_MESSAGE);
if (result != null) {
observedClass.setBoundProperty(result);
}
}
}){{setInitialDelay(1000);}}.start();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
// ** note that I don't like extending JFrame,
// but will do this for sake of example simplicity
class MainGUI extends JFrame {
public MainGUI(String title) {
super(title);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
}
class ObservedClass {
public static final String BOUND_PROPERTY = "bound property";
private String boundProperty = "";
private SwingPropertyChangeSupport spcSupport = new SwingPropertyChangeSupport(
this);
public SwingPropertyChangeSupport getSpcSupport() {
return spcSupport;
}
public void setSpcSupport(SwingPropertyChangeSupport spcSupport) {
this.spcSupport = spcSupport;
}
public String getBoundProperty() {
return boundProperty;
}
public void setBoundProperty(String boundProperty) {
String oldValue = this.boundProperty;
String newValue = boundProperty;
this.boundProperty = newValue;
spcSupport.firePropertyChange(BOUND_PROPERTY, oldValue, newValue);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
spcSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
spcSupport.removePropertyChangeListener(listener);
}
}
在我的腦海裏這一切的關鍵是使用偵聽器,以便與綁定屬性的類 - 字符串被傾聽 - 毫不知情GUI,監聽器和GUI同樣不知道具有綁定屬性的類。它們完全分離。
這似乎是這樣做的向後方式。什麼觸發了optionPane顯示?爲什麼不在這個觸發器中調用這段代碼? – 2012-04-17 20:52:31
當在應用程序的某個其他部分發現字符串重複時(與GUI沒有任何關係),會顯示JOptionPane。 從該JOptionPane中更改一個字符串,並且該更改需要反映在JFrame標題上。由於這些類不會與我通信,但通過窗口監聽器可以很容易地檢查這種變化。 – Giannis 2012-04-17 20:55:57
也許說明操作系統在這裏很有用......我不確定Windows是否向窗口發送消息以告訴它不再處於活動狀態(或者如果JVM處理它) – SJuan76 2012-04-17 20:57:38