有什麼方法可以糾正旋轉組件的尺寸?java swing:調整大小後旋轉JComponent的尺寸不正確
在我的揮杆應用程序,我想能夠旋轉的單一面板,並將其正確響應來調整事件。旋轉是直接的,但在調整大小時,高度和寬度尺寸是相反的。如果調用setSize是通過重寫的paint()調用來交換尺寸,但它不起作用,它幾乎可以工作,因爲setSize會導致另一個調用繪畫發生,並且會發生遞歸...也嘗試添加ComponentAdapter來處理調整大小事件的交換,但得到了相同的結果。
因此,下面是我正在處理的簡單示例。這裏的組件是按鈕,但邏輯也適用於JComponent,比如JPanel。按鈕c使用JXTransformer進行旋轉,但這不會調整大小(它在代碼中已被註釋掉,但如果需要,可以將JXTransformer類添加到類路徑中)。如果編譯示例,請嘗試調整窗口大小並查看旋轉後的按鈕的行爲。截圖: (它說我不能發佈的截圖,但這些鏈接看起來是活的。)
http://i.stack.imgur.com/S3qmb.png
如果我在一個尺度變換添加,調整大小是正確的,但該組件被扭曲超出可用性。截圖:
http://i.stack.imgur.com/K4l9e.png
我見過很多在這裏討論的旋轉部分的問題,但沒有關於調整大小的問題。例如,A rotated square panel in 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());
}
}
我想省卻你的麻煩,並使用'JXLayer'(http:// java。net/projects/jxlayer /)如果你沒有使用Java 7或'JLayer'(http://docs.oracle.com/javase/7/docs/api/javax/swing/JLayer.html) JLayer教程http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html) – MadProgrammer 2012-08-06 23:44:33