2013-01-14 93 views
3

我見過很多問題,要求如何以任意角度旋轉JLabel或圖像。我所需要做的就是將我的文本字段旋轉90度,但是我沒有找到專門針對該角度的更簡單的方法。我以爲我正確地複製了答案,但我的文本字段不旋轉。垂直旋轉JTextField

下面是我在做什麼的SSCCE:

import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class VerticalRotationSSCCE { 

private static class VerticalTextField extends JTextField { 

    private static final long serialVersionUID = 1L; 

    public VerticalTextField(String text) { 
     super(text); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     int cx = getWidth()/2; 
     int cy = getHeight()/2; 
     g2.rotate(1/2 * Math.PI, cx, cy); 
     super.paintComponent(g2); 
    } 

} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      JFrame frame = new JFrame(); 
      frame.getContentPane().add(new VerticalTextField("Foo")); 
      frame.pack(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
     } 

    }); 
} 

} 

什麼我從如何旋轉部件的答案失蹤?

+0

查看此鏈接。它旋轉了45度,但我相信你可以根據你的需要修改它http://www.coderanch.com/t/338773/GUI/java/rotate-text –

+0

Craig Wood的帖子是一個關注.. –

+0

我已經看過那個頁面。我不明白伍德與我的做法有什麼不同,使得它能夠旋轉。我可以請我解釋一下我錯過了什麼嗎? – Eva

回答

4

不能有效轉動互動部件還沒有轉化鼠標座標,但你可以旋轉圖形上下文來渲染 -interactive組件,如JLabel,如圖所示here。在你的例子中,1/2 * Math.PI != Math.PI/2

image

+0

+1非常好:) –

+0

NB:'1/2'的計算結果爲零,所以'1/2 * Math.PI'也計算爲零。 – trashgod

+0

我覺得真的很愚蠢。大約6個月沒有編碼,因此忘記了整數除法等愚蠢的事情。感謝您的支持! – Eva

5

其實,是的,這是可以做到,但需要一些額外的庫和訪問已消失了斷網的一些源代碼。

使用JXLayer,可以在運行時改變帶電部件...

enter image description here

public class JLayerTransform { 

    public static void main(String[] args) { 
     new JLayerTransform(); 
    } 

    public JLayerTransform() { 
     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 FieldPane fieldPane; 
     private DefaultTransformModel transformModel; 

     public ExamplePane() { 

      setLayout(new BorderLayout()); 

      slider = new JSlider(0, 360); 
      slider.setValue(0); 
      slider.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 

        transformModel.setRotation(Math.toRadians(slider.getValue())); 

       } 
      }); 

      fieldPane = new FieldPane(); 

      transformModel = new DefaultTransformModel(); 
      transformModel.setRotation(Math.toRadians(0)); 
      transformModel.setScaleToPreferredSize(true); 
      JXLayer<JComponent> rotatePane = TransformUtils.createTransformJXLayer(fieldPane, transformModel); 

      add(slider, BorderLayout.NORTH); 
      add(rotatePane); 

     } 
    } 

    public class FieldPane extends JPanel { 

     public FieldPane() { 
      setLayout(new GridBagLayout()); 

      JTextField field = new JTextField(10); 
      field.setText("Hello world"); 

      add(field); 

     } 
    } 
} 

注意事項

這需要JXLayer(我用的是第3版),SwingX (我正在使用1.6.4版本)和Piet Blok的優秀示例,這些示例不再可以在網上找到...

我已經把JXLayer(版本3)和Piet的例子的所有源代碼放到一個單獨的zip中,我建議,如果你有興趣,你可以抓取一個副本並將其存儲在某個安全的地方。

+0

+1不錯的例子 –

+0

JDK中還有一個JLayer,因爲(1.7)基本相同 – Stephan

+0

@Stephan我沒有看過'JLayer',我相信有一些細微差別,但Piet的API,沒有什麼可以跳動那是我一直堅持使用'JXLayer'的主要原因(直到我有時間重新實現它) – MadProgrammer