Вопросы, касающиеся расширения JFrame в классе? - PullRequest
0 голосов
/ 20 декабря 2009

Хорошо, я НЕ новичок в Java, просто случилось так, что я немного забыл о ядре Java, изучая более интересные вещи, такие как MySQL, сервлеты, Java EE, JDBC и т. Д .; так что не формулируйте свои ответы, как если бы я был новичком. Теперь вопрос .....

Я пишу класс (скажем, ThisIsAJFrameExtendingClass), который расширяет JFrame, и чтобы минимизировать путаницу с моим общим проектом, я также хочу разместить некоторые другие служебные методы в ThisIsAJFrameExtendingClass. Я намерен этот класс (ThisIsAJFrameExtendingClass) искать определенные входные данные от пользователя, после чего; покончить с собой (то есть dispose()). Итак, мой вопрос: как я могу независимо использовать служебные методы внутри класса без JFrame, появляющегося на экране пользователя.

Я хотел бы получить решение с помощью нескольких конструкторов внутри класса ThisIsAJFrameExtendingClass, где при вызове конструктора без аргументов возвращается JFrame, а второй конструктор с логическим аргументом предоставляет доступ к служебным методам.

[UPDATE]

Ооо .... У меня только что возникла мысль, что служебный метод имеет тип возвращаемого значения ArrayList, поэтому при условии, что вспомогательный метод вызывается utilMethod(), тогда:

ArrayList<String> pring = new ThisIsAJFrameExtendingClass().utilMethod();

будет ли приведенный выше код выводить какой-либо JFrame?

Ответы [ 4 ]

1 голос
/ 20 декабря 2009

У меня много проблем с отстаиванием вашей концепции, что звучит немного смущенно для меня. По крайней мере, это звучит как ужасный дизайн. Но у меня есть несколько предложений:

  1. Вы можете сделать эти служебные методы статичными, тогда вам вообще не нужно будет создавать экземпляр вашего класса для их использования. Это был бы самый простой случай.
  2. Вы можете упаковать свои служебные методы в статический внутренний класс вашего фрейма, что фактически сводит вас к необходимости иметь только один класс на файл.

Наконец, вы просто хотите, чтобы JFrame исчез после того, как пользователь покончил с этим, или вы хотите закрыть приложение? dispose() будет делать только первое, ваше приложение будет продолжать работать как некий процесс обезглавленного зомби.

1 голос
/ 20 декабря 2009

Вы можете сделать служебные методы static, в этом случае их можно вызывать с помощью ThisIsAJFrameExtendingClass.<method name> без создания экземпляра.

Материал о конструкторах не имеет для меня никакого смысла. Конструктор класса всегда возвращает экземпляр этого класса. Он не может вернуть «что-то еще» из-за параметра, который вы передаете.

[Отредактировано для ответа на обновление вопроса]:

new ThisIsAJFrameExtendingClass() создаст экземпляр вашего класса, запустив его конструктор (и конструктор по умолчанию для всех суперклассов). Это может выделить другие ресурсы (такие как другие компоненты Swing или что-то еще), которые требуются каждому конструктору в дереве наследования. Таким образом, создается JFrame, но если вы вызываете только utilMethod() и никогда не держитесь за ссылку на фрейм, он будет собирать мусор и его ресурсы будут освобождены в какой-то момент в будущем.

Создание экземпляра JFrame для вызова одного служебного метода в нем не особенно эффективен, но не вызовет проблем. (Как говорит Чад , по умолчанию JFrame не виден, поэтому пользователи ничего не увидят, если вы используете его в режиме "util").

Что касается возврата ArrayList, то, как правило, при использовании коллекций вы должны возвращать интерфейс самого высокого уровня, который имеет смысл, а не конкретный класс. Так что в этом случае рассмотрите возможность возврата List<String> или даже Collection<String>.

0 голосов
/ 20 декабря 2009

Или вы могли бы спроектировать его правильно и разбить служебные методы на отдельный класс ...

0 голосов
/ 20 декабря 2009

Хорошо, давайте предположим, что необходимые вам методы не являются статичными.

В этом случае помните, что JFrame не будет отображаться, пока вы не вызовете setVisible (true); Так что просто убедитесь, что вы никогда не покажете фрейм, и вы можете использовать любые функции, которые вам нужны, без раздражения для пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...