JFrame не может найти метод ‘pack’

#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.