2

キーシステムを設計するためのアプリケーションを開発しています。メイン インターフェイスは、ロックとキーの対応を示すチェックボックスの「マトリックス」で構成されています。各ロックとキーに名前を付けて、適切な所有者に配布しやすくすることができます。スペースを節約するために、ロック名のテキスト ボックスを少し傾けたいと思います。

現在の混乱 目標

私の最初の試みは、スクリーンショット (境界線が赤く塗られている) と、私の目標が何であるかを示す図に示されています。JXTransformerクラスを使用すると、フィールドを回転させることができます。今のところ、レイアウト マネージャーを使用せずにフィールドを完全に配置するだけです。

問題は、回転したテキスト フィールドが不透明な「背景」を持っているように見えることです。これにより、他のテキスト フィールドがランダムに見えなくなります。これが JXTransformer のアーティファクトなのか、Swing でコンポーネントをオーバーラップさせることが単に不可能なのか、私にはわかりません。

これが実際に不可能であるという助けや証拠をいただければ幸いです。

編集: 明確にするために、レイアウトは固定されており、サイズ変更を許可する必要はありません。

4

1 に答える 1

1

使用している Java のバージョンによって多少異なります。Alexander Potochkin は、Java 7 より前のバージョンで使用できる JXLayer というライブラリを作成しました

これは、現在 Java 7 で見られるようになった JLayer に進化しました。これに関するいくつかの基本的なデモは、次のページで見つけることができます: JLayer ビデオ

基本的にできることは、2D 回転を行うコンポーネントの上に UI を作成することです。私は過去にこのアプローチを使用して成功しました。

ここに画像の説明を入力

import java.awt.*;

import javax.swing.*;
import javax.swing.plaf.LayerUI;

/**
 * Example of rotation using {@link JLayer} in Java7.
 */
public class TiltedApproach {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Tilted components");
                LayerUI<JComponent> layerUI = new RotateUI();
                JPanel panel = new MyPanel();
                JLayer<JComponent> jLayer = new JLayer<JComponent>(panel, layerUI);
                frame.getContentPane().add(jLayer);
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setMinimumSize(new Dimension(800, 450));
                frame.setLocationRelativeTo(null); // Center
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    static class MyPanel extends JPanel {

        MyPanel() {
            add(new JLabel("Hello"));
            add(new JLabel("World"));
        }
    }

    static class RotateUI extends LayerUI<JComponent> {
        @Override
        public void paint(Graphics g, JComponent c) {
            Graphics2D g2 = (Graphics2D) g.create();
            g2.rotate(0.4);
            super.paint(g2, c);
            g2.dispose();
        }
    }
}
于 2012-11-07T13:58:24.647 に答える