【问题标题】:Rotating a JTextField vertically垂直旋转 JTextField
【发布时间】:2012-12-28 18:25:54
【问题描述】:

我已经看到了许多询问如何以任意角度旋转 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);
        }

    });
}

}

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

【问题讨论】:

  • 查看此链接。它会旋转 45 度,但我相信你可以根据需要修改它coderanch.com/t/338773/GUI/java/rotate-text
  • Craig Wood 的帖子值得一看..
  • 我已经看过那个页面了。我无法理解 Wood 的哪些部分与我的不同使得它能够旋转。我能解释一下我遗漏了什么吗?
  • 他似乎做了很多不同的事情!您是否尝试过最后一个建议 - Graphics2D.setComposite(AlphaComposite.getRotateInstance(theta))?
  • @RachelGallen 和 David Weitzman 的意思可能是 AffineTransform

标签: java swing rotation jtextfield


【解决方案1】:

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

使用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(我使用的是版本 3)、SwingX(我使用的是版本 1.6.4)和 Piet Blok 的优秀示例,这些示例在网上似乎不再可用...

我已将 JXLayer(第 3 版)的所有源代码和 Piet 的示例放在一个 zip 中,我建议,如果您有兴趣,请获取一份副本并将其存储在安全的地方。

【讨论】:

  • 自(1.7)以来JDK中还有一个JLayer,其作用基本相同
  • @Stephan 我没看过JLayer,我相信有细微的差别,但是Piet的API,没有什么比这更好的了,这是我一直坚持JXLayer的主要原因(直到我有时间重新实现它)
【解决方案2】:

您无法在不转换鼠标坐标的情况下有效地旋转 interactive 组件,但您可以旋转图形上下文以呈现 -交互组件如JLabel,如图here

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

【讨论】:

  • 注意:1/2 的计算结果为零,因此 1/2 * Math.PI 的计算结果也为零。
  • 我觉得自己很笨。大约 6 个月没有编码了,所以忘记了整数除法等愚蠢的事情。感谢您接听!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2010-11-18
相关资源
最近更新 更多