Поворотная квадратная панель в Java GUI

Интересно, возможно ли реализовать панель GUI (возможно, JPanel), которая имеет квадратную форму, но поворачивается на 90 gradleусов. Очевидно, что будет контейнер верхнего уровня, который содержит эту панель, и визуально главной панелью является эта повернутая квадратная панель внутри.

Более конкретно, я бы разделил панель (называемую «A») на четыре равные квадратные подпанели и заполнил эти подпанели JLabels, для которых я думаю использовать GridLayout. И, наконец, я бы повернул «A» на 90 gradleусов, чтобы дать то, что я хочу.

Из моего чтения других подобных вопросов кажется, что вы не можете повернуть JPanel самостоятельно, но вы можете вращать то, что содержится внутри. Это применимо к моему делу здесь? Был бы признателен, если бы кто-то мог указать. Благодарю.

Критическая вещь, кажется, окрашивает компоненты после поворота графического контекста. Вот пример:

введите описание изображения здесь

Добавление 1: Как комментарии @Atreys, вращающиеся компоненты рисуются, но плохо взаимодействуют. Если компоненты должны оставаться полезными, координаты событий также должны быть преобразованы. Сравните этот (значительно) более сложный пример, который отражает компоненты.

Добавление 2: Если вам также необходимо преобразовать координаты мыши, этот пример может оказаться полезным.

Добавление 3: В качестве альтернативы рассмотрим примеры drawString() рассмотренные здесь .

 import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; /** @see https://stackoverflow.com/questions/6333464 */ public class RotatePanel extends JPanel { public RotatePanel() { this.setPreferredSize(new Dimension(320, 240)); this.add(new JLabel("Hello World!", JLabel.CENTER)); } @Override public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; int w2 = getWidth() / 2; int h2 = getHeight() / 2; g2d.rotate(-Math.PI / 2, w2, h2); super.paintComponent(g); } private void display() { JFrame f = new JFrame("RotatePanel"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new RotatePanel().display(); } }); } } 

Проверьте JXTransformer в проекте SwingHelper на java.net. Этот class действует как декоратор компонентов, который позволяет применять произвольное аффинное преобразование к компоненту.

Да, вы должны были бы использовать контейнер верхнего уровня (JPanel или другой контейнер), который вращает содержимое. На самом деле вы не вращаете предметы, вы вращаетесь к картине предметов.

Если все, что вам нужно сделать, это повернуть текст в JLabel, вы можете использовать значок с поворотом, тогда вам не придется беспокоиться о повороте панели.

Interesting Posts
Давайте будем гением компьютера.