Создание JFrame и наблюдаемого объекта

У меня есть класс 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() (поскольку он объявлен как защищенный), который должен быть вызван перед уведомлением.

У вас есть представление о том, что я могу его реализовать?

Спасибо!!

Ответ 1

Расширьте Observable и объявите setChanged() общедоступным.

Ответ 2

Я думаю, что многие здесь, я включил в себя шаблон проектирования наблюдателя без использования формального интерфейса/класса 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.

Ответ 3

Это сделает это.

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
}