垂直旋转JTextField

Eva*_*Eva 3 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);
        }

    });
}

}
Run Code Online (Sandbox Code Playgroud)

关于如何旋转组件的答案,我错过了什么?

Mad*_*mer 5

实际上,是的,它可以完成,但需要一些额外的库并访问一些已经消失的网络源代码.

使用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);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意事项

这需要JXLayer(我使用的是版本3),SwingX(我使用的是1.6.4版本)和Piet Blok的优秀示例,网络上似乎不再可用...

我把JXLayer(版本3)的所有源代码和Piet的例子都放到一个拉链中,我建议,如果你有兴趣,你可以抓一份并将它存放在安全的地方.