Является ли метод статической утилиты не лучшим подходом в этом сценарии? - PullRequest
2 голосов
/ 31 мая 2011

У меня есть этот класс, скажем, Foo.Этот класс отвечает за создание / отображение JFrame, для чего требуется настройка heavy .

public class Foo{
    private static JFrame frame;

    public static void createAndShowFrame(){
        //do stuff
    }

    public static JFrame getFrame(){
        return frame;
    }
}

И у меня есть другой класс, скажем, Launcher, который служит точкой входа в приложение.Этот класс отвечает за начало построения графического интерфейса пользователя

public class Launcher{
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                Foo.createAndShowFrame();
            }
        });
    }
}

. Проблема проектирования getFrame().Этот метод был необходим, потому что другие диалоги требуют этого в качестве родительского фрейма.К сожалению, это обнажает фрейм и, по-видимому, аннулирует метод статической утилиты.

Я предполагаю, что мой вопрос заключается в том, есть ли более рациональный подход к дизайну?Имею ли я какой-то смысл?Я в основном хотел создать и показать кадр без необходимости extend.

См. Мой Правило большого пальца вопрос.

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Независимо от вопроса раскрытия JFrame или его инкапсуляции, почему этот класс (методы / поля) должен быть статическим?Объектно-ориентированным способом было бы иметь их обычные (экземплярные) методы:

public class FrameCreator {
    private JFrame frame;

    public void createAndShowFrame(){
        //do stuff
    }

    public JFrame getFrame(){
        return frame;
    }
}

Затем в вашем классе запуска вы должны создать объект этого класса и вызвать его методы:

public class Launcher{
    public static void main(String[] args){
        final FrameCreator f = new FrameCreator();
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                f.createAndShowFrame();
            }
        });
    }
}

Если вам нужен доступ к созданному фрейму откуда-то еще, передайте этот код экземпляру FrameCreator, который создал фрейм.

1 голос
/ 31 мая 2011

Я не вижу преимущества использования invokeLater() (РЕДАКТИРОВАТЬ - в этом случае (так как вы называете его из main()) . Если у вас есть тяжелая обработка GUI, просто сделайте это в главном потоке (потому что вы должны в любом случае). Если большая часть работы может быть выполнена в фоновом режиме, сделайте это в фоновом режиме и опубликуйте результаты в главном потоке. (используя invokeLater()). [This часть только мое мнение, не основанная на некоторых документах и ​​т.д ...]

Наконец, если вы не хотите показывать фрейм, создайте метод setChildComponent(JComponent component), который получит JComponent, и установите фрейм как его родителя внутри. Таким образом, вы избежите разоблачения частного JFrame.

...