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

Имам клас, да речем MyJFrame, който представлява GUI на моето приложение. Той имплементира интерфейса Observer и замества метода update.

public class MyJFrame extends JFrame implements Observer{
  ...
  public void update(Observable arg0, Object arg1){
     ...
  }
}

Сега искам да направя и моя JFram наблюдаем обект, но не мога, защото той вече разширява класа JFrame. Опитах се да създам променлива от тип Observable в моя клас.

public class MyJFrame extends JFrame implements Observer{
  Observable observable = new Observable();

Проблемът тук е, че мога да добавя наблюдател към това наблюдаемо поле и мога също така да уведомя наблюдателя, но не мога да извикам метода setChanghed() (защото е деклариран като защитен), който трябва да бъде извикан преди известието.

Имате ли някаква идея дали мога да го реализирам?

Благодаря!!


person Maverik    schedule 06.08.2011    source източник


Отговори (3)


Разширете Observable и декларирайте setChanged() за публичен.

person Jeffrey    schedule 06.08.2011
comment
Може ли по-подробно, моля? Благодаря! - person Maverik; 06.08.2011
comment
Когато разширите клас, можете да декларирате отново неговите методи с модификатор на видимост, който е по-висок от предишния. Тъй като Observables setChanged() беше защитен, можете да създадете подклас на Observable, като setChanged() е публичен. - person Jeffrey; 06.08.2011
comment
Сега не знам, но бях сигурен, че не е възможно да се промени видимостта на метод. Благодаря, работи! - person Maverik; 06.08.2011
comment
Може също да искате да погледнете отговора на Hovercraft. Хората са склонни да използват PropertyChangeListeners, за разлика от Observable / Observer. - person Jeffrey; 06.08.2011
comment
Така че е възможно да се увеличи видимостта, но не и да се намали, нали? Същото ли е и за променливата? Благодаря - person Maverik; 06.08.2011

Мисля, че мнозина тук, включително и аз, използват Observer Design Pattern, без да използват официалния Observer/Observable интерфейс/клас на Java , и има много начини за прилагане на това, особено в Swing. Вероятно най-гъвкавото е да се използва PropertyChangeSupport с PropertyChangeListeners, което е начинът, по който SwingWorkers прилага това. Друг е да използвате много основния интерфейс ChangeListener.

Ако имате нужда от по-конкретна помощ, моля, предоставете повече подробности за проблема си и вероятно можем да предложим предложения.

Редактиране 1
Това също осветява отделен, но важен проблем, който е предложен от описанието на вашата програма: вашият GUI клас, разширяващ JFrame. Мнозина тук (отново включително и аз) препоръчват да избягвате да правите това, освен ако кодът ви не променя присъщото поведение на JFrame -- тоест вашият клас заменя един или повече от методите на JFrame. Това е малка поддискусия в много по-голямата дискусия за това кое е по-добро: подобряване на класове чрез наследяване или чрез композиция.

Например: Предпочитате композицията пред наследяването?

Редактиране 2
Следваща нежелана препоръка: Опитвам се да насоча GUI кода си към създаване на JPanels, а не JFrames. По този начин, ако искам да покажа моя GUI като самостоятелен GUI, просто създавам JFrame в движение, поставям JPanel на графичния си интерфейс в contentPane на JFrame, пакетирам JFrame и го показвам. Правя същата процедура, ако искам да поставя GUI в JDialog, JApplet, JOptionPane или също в CardLayout с помощта на контейнер, друг JPanel,... . Това ми дава огромна гъвкавост в начина, по който използвам моите GUI.

person Hovercraft Full Of Eels    schedule 06.08.2011
comment
Така че казвате, че ако искам да направя GUI, е по-добре да декларирам JFrame като променлива на моя клас и да го използвам? - person Maverik; 06.08.2011
comment
PropertyChangeListeners + SwingWorkers, вместо Observable +1 - person mKorbel; 06.08.2011
comment
@lucaghera: Не мога да кажа кое е по-добро за вашата ситуация със 100% точност, но аз самият предпочитам да не разширявам JFrame, ако мога да избегна това и обикновено успявам да го направя. - person Hovercraft Full Of Eels; 06.08.2011
comment
Смешно е, защото плъгинът WindowBuilder на Eclipse прави същото, което направих и аз. Но мисля, че и двете версии работят ;) - person Maverik; 06.08.2011
comment
@lucaghera: Нищо смешно в това и това е още една причина, поради която не обичам да използвам инструменти за създаване на графичен интерфейс. :) - person Hovercraft Full Of Eels; 06.08.2011
comment
@lucaghera: също още една непоискана препоръка в моя отговор в Редактиране 2 по-горе. - person Hovercraft Full Of Eels; 06.08.2011
comment
много ми харесва! И аз съм съгласен! - person Maverik; 07.08.2011
comment
Допълнителен въпрос защо - person David I.; 17.06.2014

Това ще го направи.

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
} 
person Steve McLeod    schedule 06.08.2011
comment
може би правилно за OP, но там мисля, че за тези реализации изходът към GUI трябва да бъде обвит в invokeAndWait(), - person mKorbel; 06.08.2011