#java #swing #user-interface #jframe
#java #swing #пользовательский интерфейс #jframe
Вопрос:
Я беру начальный класс Java, и для назначения требуется, чтобы я написал класс для представления JPanel с кнопками для увеличения и уменьшения значения и меткой для отображения значения. Затем я должен создать отдельный класс, который создает экземпляр panel и добавляет его во фрейм. Я пытаюсь изменить размер фрейма в соответствии с размером панели, запустив метод pack. Я пытаюсь вызвать метод пакета фрейма, используя:
SwingUtilities.getAncestorOfClass(JFrame.class, this).pack()
Я получаю сообщение об ошибке «не удается найти пакет символьных методов ()». getAncestorOfClass определенно возвращает JFrame, и это правильный JFrame. Когда я запускаю метод pack изнутри класса драйвера, в котором создается JFrame, проблем нет. Есть идеи, почему он не может найти метод pack? Это потому, что я пытаюсь запустить это из отдельного файла класса? Я также не могу получить доступ к некоторым другим методам JFrame, таким как getContentPane, но я могу получить доступ к некоторым другим, таким как add. А?
Комментарии:
1. Почему бы вам просто не позвонить
jframe.pack ();
?2. Как я уже сказал, я делаю это для класса, и это назначение требует, чтобы я создал отдельный класс для представления JPanel. Я не могу просто ссылаться на JFrame, потому что он не определен в классе, в котором мне нужно вызвать
pack
метод.3. И вы уверены, что вам не нужно вызывать
pack
JPanel? Вы написалиThen, I have to create a separate class which instantiates the panel and adds it to a frame.
, и я подумал, что вы могли бы позвонитьpack
туда.4. У JPanel нет
pack
метода, и мой класс panel расширяет JPanel.
Ответ №1:
Метод SwingUtilities.getAncestorOfClass
возвращает a Container
. Теперь вы знаете, что Container
это действительно будет JFrame, но компилятор этого не делает. И Java — это статический язык, а не динамический, который просто попытается вызвать метод независимо от того, объявляет его класс или нет.
Поскольку Container
у него нет метода pack, компилятор будет жаловаться. Вам нужно будет выполнить приведение к JFrame, чтобы заставить его работать:
((JFrame)SwingUtilities.getAncestorOfClass(JFrame.class, this)).pack();
Однако будьте осторожны… Метод может возвращать значение null, если не был найден подходящий предок. Возможно, вы захотите сначала проверить это.
Комментарии:
1. Спасибо, я не знал, что компилятор работает так. Я добавлю обработчик исключений для решения проблемы с ‘null’.
2. Он отличается, скажем, от Ruby. Этот язык интерпретируется, поэтому нет никаких статических проверок, чтобы вы знали, что вы можете и не можете вызывать. Если вам случится вызвать несуществующий метод, не повезло. Конечно, это открывает всевозможные возможности в отношении расширения среды выполнения и ввода утки . Поскольку компилятор Java видит контейнер возвращаемого типа, а у него его нет
pack
, он будет жаловаться. Однако приведите его к JFrame, и все будет хорошо. Если вы не пытаетесь использовать что-то, что не является JFrame, и в этом случае вы получаете исключение во время выполнения.3. Единственный другой язык, который я когда-либо действительно использовал, — это Python — я был избалован его дисциплиной ввода: P
Ответ №2:
Вам нужно привести его к JFrame:
((JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, this)).pack();
Комментарии:
1. Ах, getAncestorOfClass возвращает общий контейнер, независимо от того, какой тип я ищу, спасибо! Я только начинаю здесь; Я вернусь, чтобы проголосовать за ваш ответ, когда у меня будет какая-то репутация 🙂
Ответ №3:
SwingUtilities.getAncestorOfClass(Class, Component)
Метод возвращает компонент, а не JFrame.