3

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

    });
}

}

コンポーネントを回転させる方法に関する回答から何が欠けていますか?

4

2 に答える 2

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

        }
    }
}

警告

これには、 JXLayer(バージョン3を使用していた)、SwingX(バージョン1.6.4を使用していた)、およびPietBlokの優れた例が必要です。

JXLayer(バージョン3)のすべてのソースコードとPietの例を1つのzipにまとめました。興味がある場合は、コピーを入手して安全な場所に保管することをお勧めします。

于 2013-01-14T23:47:08.143 に答える
4

マウス座標も変換せずにインタラクティブコンポーネントを便利に回転させることはできませんが、ここに示すように、グラフィックスコンテキストを回転して、のような非インタラクティブコンポーネントをレンダリングすることはできます。JLabel

あなたの例では、1/2 * Math.PI != Math.PI / 2

画像

于 2013-01-14T18:55:29.417 に答える