#java #image #swing #resize
#java #изображение #swing #изменение размера
Вопрос:
Я пытаюсь центрировать изображение, которое я поместил в JPanel. В моем paintComponent() у меня есть эти строки:
int x = (this.getWidth() - pic.getWidth(null)) / 2;
int y = (this.getHeight() - pic.getHeight(null)) / 2;
g2.drawImage(pic, x, y, null);
Однако изображение по-прежнему не выровнено по центру. Я распечатал this.getWidth() и this.getHeight(), и это дает мне размеры самого изображения, а не JPanel .
Идеальным решением было бы:
int x = (JPANEL.GETWIDTH() - pic.getWidth(null)) / 2;
int y = (JPANEL.GETHEIGHT() - pic.getHeight(null)) / 2;
g2.drawImage(pic, x, y, null);
Но моя проблема в том, что у меня нет доступа к ширине и высоте JPanel, поскольку эти свойства находятся в другом классе.
Я попытался создать переменные экземпляра, которые сохраняли и устанавливали ширину и высоту JPanel, которые работали. Однако, когда я изменяю размер окна, оно использует исходную ширину и высоту JPanel. Я не знаю, как обновить код, чтобы приспособиться к размеру новой JPanel при изменении размера окна. Есть идеи?
Комментарии:
1. Мой результат таков: ширина с использованием этого: 600, фактическая ширина JPanel: 702, высота с использованием этого: 400, фактическая высота JPanel: 540
2. Я также устанавливаю предпочтительный размер и минимальный размер для jpanel, если это на что-то влияет..
3. Эти комментарии следует отредактировать в вопросе. Ищите
edit
ссылку под тегами вопросов.
Ответ №1:
Я распечатал this.getWidth() и this.getHeight(), и это дает мне размеры самого изображения, а не JPanel .
Нет, эти методы дают ширину / высоту панели, а не изображения (если у вас нет пользовательского кода, который это делает).
Например, вы можете использовать фоновую панель, которая позволяет центрировать изображение (среди прочего).
Обратите внимание, что простой способ центрировать изображение — создать панель с помощью GridBagLayout
. Затем вы создаете JLabel с ImageIcon и добавляете метку на панель. По умолчанию компонент будет центрирован.
Возможно, изображение не загружается при вызове метода рисования.
g2.drawImage(pic, x, y, null);
Вышеуказанное должно быть:
g2.drawImage(pic, x, y, this);
«Это» гарантирует, что компонент будет перерисован при загрузке изображения.
Если вам нужна дополнительная помощь с вашим пользовательским кодом рисования, опубликуйте соответствующий SSCCE, который демонстрирует проблему.
Я также устанавливаю предпочтительный размер и минимальный размер для jpanel, если это на что-то влияет..
Вы не должны устанавливать предпочтительный размер. Определение предпочтительного размера является задачей менеджера компоновки.
При выполнении пользовательского рисования вы должны переопределять getPreferredSize()
метод панели, чтобы вернуть размер вашего изображения. Но тогда коду рисования все равно потребуется вычислить местоположение изображения для обработки ситуаций, когда размер панели отличается от предпочтительного размера.