2010-11-26 110 views
5

首先,這是我使用swing的第一週,然後對不起,如果我的問題太明顯。另外,我需要使用標準java庫的解決方案,因爲這是用於作業,而且我不允許使用奇怪的庫。在Java Swing上旋轉JLabel或ImageIcon

我使用JLabel和ImageIcon在JFrame上顯示圖像。現在我想將屏幕上的圖像旋轉到任意角度。我發現了一些關於Graphics2D的東西,但我沒有找到辦法做到這一點。

由於我找到的解決方案不起作用,或者我不理解它們,所以我對旋轉ImageIcon或JLabel的任何解決方案感興趣。由於我定位了在JLabel上執行setBounds的圖像,因此旋轉JLabel將是我認爲更好的解決方案(這樣我不必強制保存ImageIcon對象)。

非常感謝您的關注和對我的英語不好。

編輯... 要顯示在屏幕接下來我要做的形象:

JFrame frame = new JFrame("Something"); 
frame.setLayout(new FlowLayout()); //for example 
JPanel panel = new JPanel(); 
panel.setLayout(null); 

ImageIcon playerSprite = new ImageIcon("rute/to/file.png"); 
JLabel player = new JLabel(playerSprite); 

panel.add(player); 
player.setBounds(10,10,36,52); //for example 

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

恢復,我怎麼能旋轉此IconImage或JLabel的。如果您認爲更好,我可以使用其他方法顯示圖像。如果解決方案是使用Graphics2D的,就像我看到的,我會很高興的解決方案,以到達這個類的一個對象的後旋轉的圖像恢復到一個ImageIcon,因爲當我嘗試這個...

ImageIcon imagePlayer = new ImageIcon("img/stand.png"); 
Image image = imagePlayer.getImage(); 
Graphics2D g = (Graphics2D)image.getGraphics(); 

在執行時間,得到的答案是這樣的......

Exception in thread "main" java.lang.UnsupportedOperationException: getGraphics() not valid for images created with createImage(producer) 

二路版... 現在我與此代碼的工作。圖像旋轉,但舊的未旋轉圖像仍然保留在新的屏幕下。把一個名爲stand.png的png圖像放在同一個目錄下,你會看到它。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.lang.Math; 
public class Test { 
    public static void main(String args[]) throws Exception {  
     try { 
      JFrame frame = new JFrame("Rotation Test"); 
      frame.setBounds(10,10,1008,756); 

      BufferedImage bi = ImageIO.read(new File("stand.png")); 
      Graphics2D g = (Graphics2D)bi.getGraphics(); 
      g.rotate(Math.toRadians(45),26,26); 
      g.drawImage(bi, 0, 0, null); 
      JLabel player = new JLabel(new ImageIcon(bi)); 
      frame.getContentPane().add(player); 

      player.setBounds(0,0,100,100); 
      frame.setVisible(true); 
     } catch (IOException ex) { 
      System.out.println("Exception"); 
     } 
    } 
} 
+0

+1表示可編譯示例;作爲一個練習,嘗試使用我的示例的RotatableImage.getImage()或@ camickr的「旋轉圖標」來完成它。 – trashgod 2010-11-27 20:10:00

回答

7

而不是旋轉組件本身,考慮旋轉組件的內容。此exampleJPanel中繪製旋轉圖像。

附錄:在exampleRotatableImage.getImage()直接在內存中創建BufferedImage,但您可以使用ImageIO.read()從其他位置獲取圖像。如果要修改圖像,則支持BufferedImage#createGraphics(),但您可能只想將未修改的圖像作爲paintComponent()的一部分在旋轉的圖形上下文中繪製。

附錄:您使用旋轉副本在圖像上繪畫;相反,將圖像繪製到旋轉的圖形上下文中:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 

    public static void main(String args[]) throws Exception { 
     JFrame frame = new JFrame("Rotation Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final BufferedImage bi = ImageIO.read(new File("img/stand.jpg")); 
     frame.add(new JPanel() { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(bi.getWidth(), bi.getHeight()); 
      } 

      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       Graphics2D g2 = (Graphics2D) g; 
       g2.rotate(Math.PI/4, bi.getWidth()/2, bi.getHeight()/2); 
       g2.drawImage(bi, 0, 0, null); 
      } 
     }); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
3

因爲我找到了解決方案不起作用,或者我不明白他們

好吧,如果你不理解他們,那麼你應該張貼您的SSCCE(HTTP: //sscce.org)展示你的測試代碼。那麼也許有人可以解釋代碼是如何工作的。

我懷疑你能理解我們可能發佈的任何新代碼,因爲旋轉圖像或圖標的概念都是相同的。

既然你爲什麼要使用的setBounds我定位圖像做的setBounds上的JLabel

()。你應該使用佈局管理器,所以你不必擔心這一點。

編輯:

也許你可以使用一個Rotated Icon

+0

我必須展示一個排球場,球員在場內移動,旋轉,改變精靈等,然後我必須始終以絕對位置工作。在這種情況下,我認爲setLayout(null)是一個很好的選擇,如果我錯了,請糾正我。 – davidgnin 2010-11-27 07:24:35

+0

不過,我用一些例子編輯了主帖(我希望它可以被認爲是SSCCE:D)來說明我的問題。謝謝。 – davidgnin 2010-11-27 07:48:14