2

回転したコンポーネントの寸法を修正する方法はありますか?

私のスイングアプリケーションでは、単一のパネルを回転させ、イベントのサイズ変更に正しく応答できるようにしたいと考えています。回転は簡単ですが、サイズを変更すると、高さと幅の寸法が逆になります。setSize への呼び出しがオーバーライドされた paint() 呼び出しから呼び出されて次元を交換した場合、ほとんど機能する可能性がありますが、setSize により別の paint 呼び出しが発生し、再帰が発生するため、機能しません...また、サイズ変更イベントでのスワッピングを処理するために ComponentAdapter を追加しようとしましたが、同じ結果が得られました。

だから、ここに私が取り組んでいるものの単純化された例があります。ここでのコンポーネントはボタンですが、ロジックは JPanel のような JComponent にも適用されます。ボタン c は JXTransformer で回転されますが、サイズは変更されません (コードではコメントアウトされていますが、必要に応じて JXTransformer クラスをクラスパスに追加できます)。サンプルをコンパイルする場合は、ウィンドウのサイズを変更して、回転したボタンがどのように動作するかを確認してください。スクリーンショット: (スクリーンショットを投稿できないと言われましたが、これらのリンクは公開されているようです..)

http://i.stack.imgur.com/S3qmb.png

スケール変換を追加すると、サイズ変更は正しく行われますが、コンポーネントは使いにくいほど歪んでしまいます。スクリーンショット:

http://i.stack.imgur.com/K4l9e.png

ここで、回転部分について議論する多くの質問を見てきましたが、サイズ変更の問題については何もありません。たとえば、Java GUI で回転した正方形のパネル

ありがとう!

コード:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class RotatingTest {

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        JPanel panel = new JPanel(new BorderLayout());

        // The button rotates, but the height/width dimensions are incorrect
        RotatedButton a = new RotatedButton("ROTATED CONTENTS!");

        JButton b = new JButton("Normal Contents");

        JButton c = new JButton("Transformer Contents");
//      JXTransformer t = new JXTransformer(c);
//      t.rotate(Math.toRadians(90));

        panel.add(a, BorderLayout.CENTER);
        panel.add(b, BorderLayout.WEST);
//      panel.add(t, BorderLayout.EAST);

        panel.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));

        frame.add(panel);
        frame.pack();
        frame.setVisible(true);

    }
}
class RotatedButton extends JButton{

    private static final long serialVersionUID = -3355833063753337573L;

    RotatedButton(String string){
        super(string);
    }


    @Override
    protected void paintComponent(Graphics g) {

        int width = getWidth();
        int height = getHeight();

        Graphics2D graphics = (Graphics2D) g;
        AffineTransform txOrig = graphics.getTransform();
        AffineTransform transformer = new AffineTransform(txOrig);

        transformer.translate(width/2, height/2);
        transformer.rotate(Math.toRadians(90));
        transformer.translate(-height/2, -width/2);

        // this scaling fits the button to the window, but distorts the contents
//      double coef1 = (double)width / (double)height;
//      double coef2 = (double)height / (double)width;
//      transformer.scale(coef2, coef1);

        // this line sets the rotation, comment out to disable
        graphics.setTransform(transformer);

        super.paintComponent(graphics);
        graphics.setTransform(txOrig);
        graphics.dispose();

        System.out.println("Parent size: "+getRootPane().getParent().getSize());
        System.out.println("this size: "+getSize());


    }
}
4

1 に答える 1

0

したがって、ここでの問題はJComponents、サイズを設定するときに実際に何があるかを気にしないことです。その中の何かを変更するpaintComponent()と、コンポーネントの表面的な部分にのみ影響し、コンポーネントから実際に返されるものには影響しません。やりたいことは、paintComponent()メソッドを改造するか、コンポーネントのサイズを変更する方法を変更することです。

大きすぎるボタンに画像を配置するときのように考えてください。ボタンは単に何ができるかを表示するだけで、残りはボタンに関する限り重要ではありません。上でグラフィックスを回転させるのJComponentもまったく同じ方法です。事前にグラフィックスを作成し、そのサイズに設定することができます (これは複雑な方法です)。または、90 度しか回転していない場合は、単に int の値を変更しますsetSize()。2 つ目は、追加のコードなしで常にサイズを変更できるため、すべての寸法を切り替えることを忘れないでください。

ただし、90 度の倍数ではない角度で配置したい場合は、コンポーネントが収まる大きな正方形を作成する必要があります。 (ピタゴラスの理論を使用して) これはばかげているように思えるかもしれませんが、左上隅から、すべての座標がどのように作成されるか。そのコーナーはそのオブジェクトの位置を定義しますが、それが絶対位置 (最も左端のポイント) でない場合、そのコンポーネントを操作するものは、単に計算するのではなく、コンポーネントのすべての部分を手動で調べる必要があります。

遅いかもしれませんが、これがお役に立てば幸いです。

于 2013-10-09T18:12:35.213 に答える