2012-08-06 66 views
2

有什麼方法可以糾正旋轉組件的尺寸?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()); 


    } 
} 
+0

我想省卻你的麻煩,並使用'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

回答

0

所以,這裏的問題是,JComponents不在乎究竟是他們設置的大小時。當您修改paintComponent()中的某些內容時,它只會影響組件的表面部分,而不會影響組件返回的任何內容。你想要做的是改造你的paintComponent()方法,或改變你如何調整組件的大小。

想象一下,當您將圖像放在太大的按鈕上時。該按鈕將簡單地顯示它可以做什麼,其餘的按鈕無關緊要。旋轉JComponent上的圖形與完全相同。您可以提前創建圖形,並將尺寸設置爲(這是複雜的方式),或者如果您只旋轉90度,則只需更改爲setSize()設置int的值即可。我總是發現第二個非常簡單,因爲你可以不需要額外的代碼就可以不斷地改變它的大小,你只需要記住切換所有的維度。

但是,如果你希望把它放在一個不是90度倍數的角度上,你將不得不爲一個更大的方塊坐在上面(使用畢達哥拉斯理論)這可能看起來很愚蠢,但從左上角考慮如何製作所有座標。該角定義了該對象的位置,但如果它不在絕對位置(最左邊的最高點),那麼使用該組件的任何東西都必須手動查看組件的每個部分,而不是僅僅計算它。

希望這可以幫助,儘可能晚。

相關問題