Un panel cuadrado girado en Java GUI

Me pregunto si es posible implementar un panel GUI (posiblemente JPanel) que sea de forma cuadrada pero rotado 90 grados. Obviamente, habrá un contenedor de nivel superior que contiene este panel, y visualmente el panel principal es este panel cuadrado girado.

Más específicamente, dividiría un panel (llamado ‘A’) en 4 subpaneles cuadrados iguales, y llenaría estos subpaneles con JLabels, para lo cual estoy pensando en usar GridLayout. Y, por último, rotaría ‘A’ 90 grados para dar lo que quiero.

Por mi lectura de otras preguntas similares, parece que no puedes rotar JPanel, pero puedes rotar lo que contiene. ¿Esto es aplicable a mi caso aquí? Agradecería si alguien pudiera señalar. Gracias.

Lo más crítico parece ser pintar los componentes después de rotar el contexto gráfico. Aquí hay un ejemplo:

enter image description here

Addendum 1: Como comenta @Atreys, los componentes girados se dibujan, pero interactúan mal. Si los componentes deben seguir siendo utilizables, las coordenadas del evento también deben transformarse. Compare este (considerablemente) ejemplo más complejo que refleja componentes.

Addendum 2: si también necesita transformar las coordenadas del mouse, este ejemplo puede ser útil.

Addendum 3: Alternativamente, considere los ejemplos de drawString() examinados aquí .

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

Consulte JXTransformer en el proyecto SwingHelper en java.net. Esta clase actúa como un decorador de componentes que le permite aplicar una transformación afín arbitraria a un componente.

Sí, debería tener el contenedor de nivel superior (JPanel u otro contenedor) como el elemento que rota el contenido. Realmente no está rotando los artículos, está girando para pintar los artículos.

Si todo lo que necesita hacer es rotar el texto en un JLabel, podría usar un icono girado , entonces no tiene que preocuparse por rotar el panel.