Um painel quadrado girado na GUI Java

Gostaria de saber se é possível implementar um painel GUI (possivelmente JPanel) de formato quadrado, mas girado 90 graus. Obviamente, haverá um contêiner de nível superior que contém esse painel e, visualmente, o painel principal é esse painel quadrado rotacionado.

Mais especificamente, eu dividiria um painel (chamado ‘A’) em 4 sub-painéis quadrados iguais e preencheria esses sub-painéis com o JLabels, para o qual estou pensando em usar o GridLayout. E finalmente, eu giraria ‘A’ 90 graus para dar o que eu quero.

Da minha leitura de outras perguntas semelhantes, parece que você não pode rodar JPanel em si, mas você pode girar o que está contido dentro. Isso é aplicável ao meu caso aqui? Apreciaria se alguém pudesse apontar. Obrigado.

O mais importante parece ser pintar os componentes depois de girar o contexto gráfico. Aqui está um exemplo:

insira a descrição da imagem aqui

Adendo 1: Como os comentários do @Atreys, os componentes rotacionados são desenhados, mas interagem mal. Se os componentes devem permanecer utilizáveis, as coordenadas do evento também devem ser transformadas. Compare esse (consideravelmente) exemplo mais complexo que espelha os componentes.

Adendo 2: Se você também precisa transformar as coordenadas do mouse, este exemplo pode ser útil.

Adendo 3: Como alternativa, considere os exemplos de drawString() examinados aqui .

 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(); } }); } } 

Confira o JXTransformer no projeto SwingHelper no site java.net. Essa class age como um decorador de componentes que permite aplicar uma transformação de afinidade arbitrária a um componente.

Sim, você teria que ter o contêiner de nível superior (JPanel ou outro contêiner) como o item que gira o conteúdo. Realmente você não está girando os itens, você está girando para a pintura dos itens.

Se tudo que você precisa fazer é girar o texto em um JLabel, você pode usar um ícone rotacionado, então você não precisa se preocupar em girar o painel.