По какой-то причине размер ImagePanel не совпадает с размером JFrame
Ну, вы НЕ должны устанавливать размер для кадра.
ВсеКомпоненты Swing отвечают за определение своего собственного размера.Таким образом, вы ДОЛЖНЫ добавить все компоненты в фрейм, а затем использовать:
frame.pack();
frame.setVisible( true );
Это вызовет менеджер компоновки, и теперь размер фрейма будет зависеть от предпочтительного размера компонентов.
Так что проблема с вашим пользовательским компонентом.Вам нужно реализовать метод getPreferredSize()
, чтобы вернуть размер вашего изображения.Тогда метод pack () фрейма будет работать правильно.Прочитайте раздел из учебника по Swing по Custom Painting для получения дополнительной информации и рабочих примеров.
this.setPreferredSize(new Dimension(400, 400));
Вы НЕ должны вручную устанавливать предпочтительный размер.Как упоминалось выше, метод pack () вычисляет предпочтительный размер.
panel.setPreferredSize(this.getPreferredSize());
Это также не решение.Рамка содержит строку заголовка и границы, поэтому размер панели НЕ будет соответствовать размеру рамки.Опять же, пусть размер изображения определяет предпочтительный размер кадра.
Если вам нужно, чтобы изображение было определенного размера, используйте Image.getScaledInstance(...)
для масштабирования изображения.
Когда я устанавливаю размер ImagePanel равным размеру JFrame, размер всех моих компонентов изменяется.
Фактически, только размеры JTextField изменяются.По какой-то странной причине «максимальная высота» JTextField не ограничена.Для JLabel и JButton максимальная высота является предпочтительной высотой.
Как упоминалось в T67, BoxLayout изменяет размеры компонентов до максимального размера.Хотя, если вы последуете моим советам сверху, вам не нужно об этом беспокоиться.Это будет проблемой только в будущих приложениях, когда размер рамки будет изменен.
Я использую пользовательский класс, который переопределяет paintComponent для использования ImageIcon
Почему высоздать ImageIcon, но не использовать его?Не используйте ImageIcon (...), просто чтобы прочитать изображение.
Вместо этого используйте ImageIO.read(...)
, чтобы прочитать изображение и избавиться от ImageIcon.Это правильный способ прочитать изображение, и вы получите сообщение об ошибке, если изображение не найдено, что помогает при отладке.