[英]Observer/Observable in a GUI
不久前我問了一個類似的問題,我正在嘗試實施該解決方案。 我有一個JPanel,最終將在其上具有許多控件以生成數字,但是現在它只有一個JButton作為測試。 我正在使用Observer和Observable使JPanel讓JFrame知道某些更改。 我似乎能夠告訴觀察者注意什么,但是update()似乎沒有調用觀察者對象。 我不確定哪里出了問題,要找到關於Observer / Observable的好的教程幾乎是不可能的。
Object Subpanel擴展了Observable,並且在Subpanel內部是我添加到JFrame的JPanel。 這似乎是獲得GUI來擴展Observable的唯一方法。
很抱歉,這聽起來令人困惑。 我不知道還有什么其他解釋。 我只希望GUI菜單對象能夠在發生更改時通知JFrame。
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestObserver implements Observer{
JFrame frame = new JFrame();
//The panel in the frame that is to be watched for a change.
SubPanel sf = new SubPanel();
TestObserver(){
frame.setTitle("New Program!");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
sf.addOutsideObserver(this);
frame.add(sf.panel);
frame.setVisible(true);
}
@Override
public void update(Observable arg0, Object arg1) {
// TODO Auto-generated method stub
System.out.println("I have been notified!");
}
public static void main(String[] args) {
TestObserver mf = new TestObserver();
}
}
class SubPanel extends Observable implements ActionListener{
JPanel panel = new JPanel();
JButton b = new JButton();
int count = 0;
// Observer ob = new Observer();
SubPanel(){
b.addActionListener(this);
panel.add(b);
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
// The counter is not important, just something to display
count++;
System.out.println("Count: " + count);
// This does not seem to be happening in the Observer object
notifyObservers();
}
public void addOutsideObserver(Observer o){
addObserver(o);
System.out.println("I'm added!");
}
}
notifyObservers()
僅在發生更改(由hasChanged()
方法驗證notifyObservers()
后才起作用 。
在您的代碼中,您需要添加setChanged()
以便在調用notify
之前設置更改指示器。
你並不需要調用clearChanged()
之后,因為這種方法被自動調用notifyObservers
方法 。
Observable
類有一個叫做構件changed
默認為false
其可以通過保護被修改setChanged
方法。 notifyObservers
方法只返回如果沒有做任何changed
是假的。 因此,在調用notifyObservers
之前,請先調用setChanged,這樣它將更新觀察者。
public void notifyObservers(Object arg) {
if (!changed)
return;
...
}
編輯:我剛剛注意到答案中已經提供了答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.