回転したコンポーネントの寸法を修正する方法はありますか?
私のスイングアプリケーションでは、単一のパネルを回転させ、イベントのサイズ変更に正しく応答できるようにしたいと考えています。回転は簡単ですが、サイズを変更すると、高さと幅の寸法が逆になります。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());
}
}