2011-06-13 38 views
11

Me pregunto si es posible implementar un panel de 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.Un panel cuadrado girado en Java GUI

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.

De mi lectura de otras preguntas similares, parece que no puede rotar JPanel en sí, pero puede rotar lo que está dentro. ¿Esto es aplicable a mi caso aquí? Agradecería si alguien pudiera señalar. Gracias.

Respuesta

13

Lo más crítico parece ser pintar los componentes después de girando el contexto gráfico. He aquí un ejemplo:

enter image description here

adición 1: Como @Atreys comentarios, los componentes rotados se dibujan, sino que interactúan mal. Si los componentes deben seguir siendo utilizables, las coordenadas del evento también deben transformarse. Compare esto (considerablemente) más complejo example que duplica los componentes.

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

Addendum 3: Alternativamente, considere los ejemplos drawString() examinados here.

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

buen truco :) Tenía curiosidad sobre cómo se manejaban los objetos en los que puede hacer clic, así que agregué un botón a la etiqueta también. Lo dibujó rotado, pero también no girado (a veces). Además, el panel percibe cualquier evento registrado en su orientación no rotada – Atreys

+0

@Atreys: Buen punto, aunque una solución no es trivial. He elaborado más arriba. – trashgod

+0

Esto es bueno, pero ¿es este método general? Por ejemplo, si solo giro el panel "A" por 45 grados, ¿esto lo haría aparecer como una forma de diamante y todo dentro de rotar también 45 grados (por ejemplo, etiquetas, bordes de subpaneles, etc.)? Gracias. – skyork

2

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

2

Si todo lo que necesita hacer es girar el texto en un JLabel se puede utilizar un Rotated Icon, entonces usted no tiene que preocuparse acerca de cómo girar el panel.

3

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.