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

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

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

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

Ответ 1

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

enter image description here

Добавление 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();
            }
        });
    }
}

Ответ 2

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

Ответ 3

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

Ответ 4

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