Можем ли мы наклонить JPanel под углом? - PullRequest
0 голосов
/ 11 марта 2011

У меня есть изображение внутри JPanel. Я хотел бы повернуть изображение. Можно ли повернуть JPanel с помощью Graphics, Изображение вращаемое, Просто из любопытства можно ли вращать JPanel?

Ответы [ 4 ]

2 голосов
/ 13 июня 2011

Да!Это возможно и довольно просто тоже.Я не делал ротации, но я успешно выполнил другие аффинные преобразования (масштабирование всего GUI вверх и вниз) в проекте.Я не могу понять, почему вращения должны быть другими.

Вместо того, чтобы пытаться масштабировать каждый компонент, используйте тот факт, что вы можете установить преобразование для объекта Graphics.Так как это распределяется между всеми визуализируемыми компонентами, все вещи преобразуются одновременно «бесплатно».Важно понимать, что преобразование - это только шаг процесса рендеринга ... т.е. все компоненты все еще верят, что у них есть границы (местоположения + размеры), которые вы дали им в нетрансформированном мире.Это оставляет нам задачу правильно обрабатывать события мыши.Для этого вы просто добавляете стеклянную панель перед главной панелью.Эта панель собирает все события мыши и применяет обратное преобразование к событию, а затем отправляет событие далее ко всем другим компонентам.

Концептуально очень просто!Тем не менее, я помню, что потребовалось некоторое время, чтобы все это стало четким.Особенно тот факт, что визуализированные тексты (шрифты) в Java некорректно линейно масштабируются (масштабируется дискретными шагами, соответствующими размерам шрифта), поставили последнюю проблему в моем случае scale-affine-translation.Может быть, вам не нужно беспокоиться об этом, если вы только вращаетесь.

Я получил вдохновение от JXTransformer: http://www.java.net/blog/alexfromsun/archive/2006/07/jxtransformer_t.html

1 голос
/ 11 марта 2011

Насколько я знаю, вы не можете вращать саму JPanel, но вы можете поворачивать изображение внутри JPanel, используя Java2D. Вот статья , которая может помочь.

Edit:

На самом деле может быть способ повернуть JComponents (например, JPanel), если вы переопределите их методы paintXxx и используете AffineTransform .

0 голосов
/ 11 марта 2011

Да, это возможно. Но вы не будете вращать панель, но изображение:

public void paintComponent(Graphics gg)
{
    Graphics2D g = (Graphics2D) gg;
    g.setRenderingHint(RenderingHints.KEY_ANTI_ALIAS, RenderingHints.VALUE_ANTI_ALIAS_ON);
    AfflineTransform matrix = g.getTransform(); // Backup
    float angle = Math.PI / 4.0f; // 45°
    g.rotate(angle);
    /* Begin */
    g.drawImage(yourImage, [your coordinates], null);
    /* End */
    g.setTranform(matrix); // Restore

}

Все между /* Begin */ и /* End */ будет нарисовано повернуто.

(я не тестировал код, поэтому могут быть некоторые синтаксические ошибки ...)

0 голосов
/ 11 марта 2011

Невозможно вращать саму JPanel, но, безусловно, можно вращать любое изображение внутри. Существует довольно много способов сделать это, например, вы можете переопределить JPanel's public void paint(Graphics g) и затем привести Graphics к Graphics2D. Это очень полезный класс, делает вращение и многое другое;) Проверьте api docs для получения дополнительной информации об этом.

...