Ответ 1
Расширьте Observable
и объявите setChanged()
общедоступным.
У меня есть класс let say MyJFrame
, который представляет GUI моего приложения. Он реализует интерфейс Observer
и переопределяет метод update
.
public class MyJFrame extends JFrame implements Observer{
...
public void update(Observable arg0, Object arg1){
...
}
}
Теперь я хочу сделать также свой объект JFram an Observable, но я не могу, потому что он уже расширяет класс JFrame
. Я попытался создать переменную типа Observable в моем классе.
public class MyJFrame extends JFrame implements Observer{
Observable observable = new Observable();
Проблема в том, что я могу добавить Observer в это наблюдаемое поле, и я также могу уведомить наблюдателя, но я не могу вызывать метод setChanghed()
(поскольку он объявлен как защищенный), который должен быть вызван перед уведомлением.
У вас есть представление о том, что я могу его реализовать?
Спасибо!!
Расширьте Observable
и объявите setChanged()
общедоступным.
Я думаю, что многие здесь, я включил в себя шаблон проектирования наблюдателя без использования формального интерфейса/класса Java Observer/Observable
, и есть много способы реализации этого, особенно в Swing. Вероятнее всего, наиболее гибким является использование PropertyChangeSupport
с PropertyChangeListeners
, как это реализует SwingWorkers. Другим является использование самого базового интерфейса ChangeListener.
Если вам нужна более конкретная помощь, предоставьте более подробную информацию о своей проблеме и, вероятно, мы сможем предложить предложения.
Изменить 1
Это также относится к отдельной, но важной проблеме, которая предлагается в описании вашей программы: ваш GUI-класс, расширяющий JFrame. Многие здесь (опять же включенные мной) рекомендуют вам избегать этого, если ваш код не изменяет внутреннее поведение JFrame - это то, что ваш класс переопределяет один или несколько методов JFrame. Это небольшое обсуждение в гораздо более широком обсуждении, которое лучше: повышение классов через наследование или посредством составления.
Например: Предпочитаете композицию над наследованием?
Изменить 2
Следующая рекомендация без комментариев: я пытаюсь передать свой код GUI для создания JPanels, а не JFrames. Таким образом, если я хочу отображать мой графический интерфейс в качестве автономного графического интерфейса, я просто создаю JFrame на лету, поместите свой gui JPanel в JPrame contentPane, упакуйте JFrame и покажу его. Я делаю ту же процедуру, если я хочу поместить gui в JDialog, JApplet, JOptionPane или в CardLayout, используя контейнер, другой JPanel,.... Это дает мне огромную гибкость в том, как я использую свои gui's.
Это сделает это.
public class MyJFrame extends JFrame implements Observer {
private static class MyObservable extends Observable {
@Override
public void setChanged() {
super.setChanged();
}
}
private final MyObservable observable = new MyObservable();
// rest of your code
}