垂直旋转JTextField
我见过很多问题,要求如何以任意angular度旋转JLabel或图像。 我所需要做的就是旋转我的文本字段90度,但我还没有find一个更容易的方法专门针对该angular度。 我以为我正确地复制了答案,但我的文本字段不旋转。
这是我正在做的一个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); } }); } }
我从关于如何旋转组件的答案中错过了什么?
如果不转换鼠标坐标,就不能有用地旋转交互组件,但是您可以旋转graphics上下文来渲染非 交互组件(如JLabel
,如下所示。
在你的例子中, 1/2 * Math.PI != Math.PI / 2
。
其实,是的,这是可以做到的,但是会需要一些额外的库和访问一些已经消失的源代码。
使用JXLayer
,可以在运行时转换实时组件…
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 (我使用的是第三版 ), SwingX (我正在使用版本1.6.4)以及Piet Blok的优秀示例,这些示例不再可以在网上find。
我已经把JXLayer(版本3)和Piet的例子的所有源代码放到一个zip文件中 ,我build议,如果你有兴趣,你可以抓取一个副本,并把它存储在一个安全的地方。