java - 垂直旋转 JTextField

标签 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);
        }

    });
}

}

关于如何旋转组件的答案中我遗漏了什么?

最佳答案

实际上,是的,这是可以做到的,但需要一些额外的库和访问一些已经从网上消失的源代码。

使用JXLayer,可以在运行时转换 Activity 组件...

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 中我建议,如果您有兴趣,可以拿一份副本并将其存放在安全的地方。

关于java - 垂直旋转 JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14324460/

相关文章:

java - 需要解释 swing 方法 Paint() 的工作原理吗?

c# - "IOException:invalid stream header: 00010000"在 TCP 上从 C# 主机向 Java 客户端获取数据时

java - 在 JFrame(Panel) 中加载 .Jar Applet

ios - 旋转 UIImage

android - 旋转后找不到 fragment 的 id 0x View ?

c++ - 旋转功能奇怪的行为

Java ClassCircularityError ,运行时还是编译时?

java - Powermock : Mocking static final logger

java - 如何创建一个不会被调用两次的绘画类?

java - 作为调用父框架的对话框启动应用程序