垂直旋转JTextField

时间:2013-01-14 18:37:53

标签: java swing rotation jtextfield

我见过很多问题,询问如何以任意角度旋转JLabel或图像。我需要做的就是将文本字段旋转90度,但我还没有找到一种特别适合该角度的方法。我以为我正确地复制了答案,但是我的文字字段没有旋转。

这是我正在做的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);
        }

    });
}

}

关于如何旋转组件的答案我缺少什么?

2 个答案:

答案 0 :(得分: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中,我建议,如果您有兴趣,可以抓取副本并将其存储在安全的地方。 / p>

答案 1 :(得分:4)

如果不转换鼠标坐标,您无法有效地旋转交互式组件,但可以旋转图形上下文以呈现 - 交互式组件,如JLabel,如here所示。

在您的示例中,1/2 * Math.PI != Math.PI / 2

image