Повернутая квадратная панель в Java GUI - PullRequest
11 голосов
/ 13 июня 2011

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

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

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

Ответы [ 4 ]

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

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

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();
            }
        });
    }
}
3 голосов
/ 13 июня 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...