C’è un modo per ruotare questi 90 gradi?

Questo è il mio codice attuale:

package Calendar; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Timer; public class Clock extends JLabel { private String pattern; private Timer timer; public Clock(String pattern){ this.pattern = pattern; createTimer(); timer.start(); } public Clock(){ pattern = "hh:mm:ss a"; createTimer(); timer.start(); } private void createTimer(){ timer = new Timer(0, new ActionListener() { @Override public void actionPerformsd(ActionEvent arg0) { setText(new SimpleDateFormat(pattern).format(new Date())); } }); } public static void main(String[] args){ JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel contentPane = new JPanel(); frame.setContentPane(contentPane); Clock digitalClock = new Clock(); contentPane.add(digitalClock); frame.setVisible(true); } } 

e non posso per la vita di me capire come farlo ruotare. Ho guardato su molti altri forum ma non c’era nessun altro membro con questo problema.

Per quanto posso dire, non c’è modo di ruotare uno JPanel o JFrame quindi sono sfortunato?

Questo è quello che sembra in questo momento:

Orologio digitale

E vorrei ottenerlo in modo che il testo sia ruotato di 90 gradi. fondamentalmente verticale.

MODIFICA: SOLUZIONE:

  package Calendar; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JLabel; import javax.swing.Timer; import java.awt.*; import java.awt.geom.*; public class Clock extends JLabel { private String pattern; private Timer timer; public Clock () { super(); pattern = "hh:mm:ss a"; createTimer(); timer.start(); } public Clock(String pattern) { super (pattern); this.pattern = pattern; createTimer(); timer.start(); } private void createTimer(){ timer = new Timer(0, new ActionListener() { @Override public void actionPerformsd(ActionEvent arg0) { setText(new SimpleDateFormat(pattern).format(new Date())); } }); } public void paint (Graphics g) { if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D) g; AffineTransform flipTrans = new AffineTransform(); double widthD = (double) getWidth(); flipTrans.setToRotation(-Math.PI / 2.0, getWidth() / 2.0, getHeight() / 2.0); g2.setTransform(flipTrans); super.paint(g); } else { super.paint(g); } } } 

Questo è basato su questo esempio e fa uso di JXLayer per ruotare fisicamente il componente etichetta nel modo desiderato.

Inoltre, ti evita di dover eseguire qualsiasi disegno personalizzato.

Ho usato una tecnica simile per ruotare JTabbedPane tabs di JTabbedPane modo che corrano verticalmente lungo il lato di JTabbedPane

Orologio

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.jdesktop.jxlayer.JXLayer; import org.pbjar.jxlayer.demo.TransformUtils; import org.pbjar.jxlayer.plaf.ext.transform.DefaultTransformModel; public class RotateClock { public static void main(String[] args) { new RotateClock(); } public RotateClock() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new ExamplePane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class ExamplePane extends JPanel { private JSlider slider; private Clock clock; private DefaultTransformModel transformModel; public ExamplePane() { setLayout(new BorderLayout()); slider = new JSlider(0, 360); slider.setValue(0); slider.setSnapToTicks(true); slider.setPaintTicks(true); slider.setMajorTickSpacing(10); slider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { transformModel.setRotation(Math.toRadians(slider.getValue())); } }); clock = new Clock(); transformModel = new DefaultTransformModel(); transformModel.setRotation(Math.toRadians(0)); transformModel.setScaleToPreferredSize(true); JXLayer rotatePane = TransformUtils.createTransformJXLayer(clock, transformModel); add(slider, BorderLayout.NORTH); add(rotatePane); } } public class Clock extends JLabel { private String pattern; private Timer timer; public Clock(String pattern) { this.pattern = pattern; setText(new SimpleDateFormat(pattern).format(new Date())); createTimer(); timer.start(); } public Clock() { this("hh:mm:ss a"); } private void createTimer() { timer = new Timer(0, new ActionListener() { @Override public void actionPerformsd(ActionEvent arg0) { setText(new SimpleDateFormat(pattern).format(new Date())); } }); timer.setInitialDelay(0); } } } 

Questo riguarda, tra le altre cose, le stranezze con gli eventi del mouse e la dimensione preferita del componente.

Sfortunatamente, il codice richiesto per eseguire la trasformazione (gli esempi di Piet) non è più disponibile in rete

Ho messo tutto il codice sorgente di JXLayer (versione 3) e gli esempi di Piet in un unico zip e suggerirei, se sei interessato, di prenderne una copia e conservarla in un posto sicuro.