2012-04-09 251 views
1

我有一個JPanel與JScrollPane包圍。此JPanel用於顯示圖像。我需要提供zoomIn,zoomOut,clockwiseRotate和antiClockwiseRotate等功能。所有這些功能都單獨運行良好。對於縮放,我稱之爲圖形對象的縮放。它發生在左上角到右下角的基礎上。對於旋轉,我重置比例,並翻譯,旋轉&回傳圖形對象。但是,當我將縮放與旋轉結合起來時,它的行爲有所不同。例如,我順時針旋轉,圖像旋轉到1.57079633弧度(大約90度)。現在,當我按縮放時,圖像變得放大,但縮放發生在右上和左下的基礎上,而不是左上和右下。如果我再次按順時針方向旋轉圖像,則重置縮放,即將圖像縮放到其原始大小,然後調用平移,旋轉和迴轉圖形對象。現在,如果再次按變焦,則會根據右下角和左上角進行放大。Java Swing旋轉和縮放

因此,問題是當面板座標改變時,圖像的座標不會改變。有人能幫我改變圖像的座標嗎?

public void paint(Graphics g) 
{  
    Graphics2D g2d = (Graphics2D)g; 
    g2d.translate((tempWidth/2), (tempHeight/2)); 
    g2d.rotate(m_rotate); 
    g2d.translate(-(tempWidth/2), -(tempHeight/2)); 
    g2d.scale(m_zoom, m_zoom); 
    if(this.image != null && this.image.getHeight(null) > 0) 
    { 
     g2d.drawImage(this.image, 0, 0,302,312,this);   
    } 
    else 
    { 
     g2d.drawString("View Image Here!. ", 20, 20); 
    }  
} 
+0

http://stackoverflow.com/questions/10040502/zoom-panel-in-java-appliction/10040546#10040546 – StanislavL 2012-04-09 10:40:41

+0

1)爲了更好地幫助越早,張貼[SSCCE](HTTP:// SSCCE .org等/)。 2)在'JPanel'中覆蓋'paintComponent()'而不是'paint()'3)'this.image.getHeight(null)'應該是'this.image.getHeight(this)' – 2012-04-09 10:53:06

+0

另請參閱this [答案](http://stackoverflow.com/a/4292509/230513)。 – trashgod 2012-04-09 19:37:25

回答

0

感謝您的幫助。這讓我在新的層面上思考,這幫助我解決了這個問題。我所做的只是在旋轉之前縮放圖像,並且現在運行良好。

public void paint(Graphics g) 
{   
    Graphics2D g2d = (Graphics2D)g; 
    g2d.scale(m_zoom, m_zoom);//This is what made the magic  
    g2d.translate((tempWidth/2), (tempHeight/2));  
    g2d.rotate(m_rotate);  
    g2d.translate(-(tempWidth/2), -(tempHeight/2)); 
    /*g2d.scale(m_zoom, m_zoom); removed this and placed above */ 
    if(this.image != null && this.image.getHeight(null) > 0)  
    {   
     g2d.drawImage(this.image, 0, 0,302,312,this); 
    } 
    else 
    {   
     g2d.drawString("View Image Here!. ", 20, 20); 
    }  
}