簡體   English   中英

GUI中的觀察者/可觀察者

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM