Я задал подобный вопрос некоторое время назад, и я пытаюсь реализовать это решение. У меня есть JPanel, который, в конце концов, будет иметь несколько элементов управления, чтобы сгенерировать число, но сейчас у него просто один JButton в качестве теста. Я использую Observer и Observable для того, чтобы JPanel позволял JFrame знать, что что-то изменилось. Кажется, я могу сказать Наблюдателю что-то посмотреть, но update(), похоже, не вызывает объект Observer. Я не уверен, где я ошибаюсь, и найти хороший учебник по Observer/Observable почти невозможно.Наблюдатель/Наблюдаемый в графическом интерфейсе
Подпанель объекта расширяема Наблюдаемая и внутри Subpanel - это JPanel, который я добавляю в JFrame. Кажется, это единственный способ получить графический интерфейс для расширения 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!");
}
}
Java JavaDocs for notifyObserver * «Если этот объект был изменен, как указано методом hasChanged, то уведомите всех его наблюдателей, а затем вызовите метод clearChanged, чтобы указать, что этот объект больше не изменен. *« – MadProgrammer