2010-11-26 10 views
5

सबसे पहले, यह पहला सप्ताह है जिसे मैं स्विंग का उपयोग करता हूं, तो क्षमा करें यदि मेरा प्रश्न बहुत स्पष्ट है। साथ ही, मुझे मानक जावा पुस्तकालयों का उपयोग करने वाले समाधानों की आवश्यकता है, क्योंकि यह होमवर्क के लिए है और मुझे अजीब पुस्तकालयों का उपयोग करने की अनुमति नहीं है।जावा स्विंग पर JLabel या ImageIcon घुमाएं

मैं जेएफआरएएम पर छवियों को दिखाने के लिए छवि आइकन के साथ जेएलएबल का उपयोग कर रहा हूं। अब मैं स्क्रीन पर छवि को मनमाने ढंग से कोणों पर घुमा देना चाहता हूं। मुझे ग्राफिक्स 2 डी के बारे में कुछ मिला लेकिन मुझे ऐसा करने का तरीका नहीं मिला।

चूंकि जो समाधान मैंने पाया है वह काम नहीं करता है या मैं उन्हें समझ नहीं पा रहा हूं, मुझे ImageIcon या JLabel को घुमाने के लिए किसी भी समाधान में रूचि है। चूंकि मैं जेएलएबल पर सेटबाउंड करने वाली छवि को स्थान दे रहा हूं, इसलिए जेएलएबल एक बेहतर समाधान होगा जो मुझे लगता है (इस तरह मुझे छवि आइकन ऑब्जेक्ट को भी सहेजने के लिए मजबूर नहीं किया गया है)।

आपके बुरे अंग्रेजी के लिए आपका ध्यान और खेद के लिए धन्यवाद।

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) 

2th संस्करण ... अब मैं इस कोड के साथ काम कर रहा हूँ है। छवि घूमती है लेकिन पुरानी अनारक्षित छवि अभी भी नई स्क्रीन के नीचे स्क्रीन पर बनी हुई है। एक ही निर्देशिका पर स्टैंड.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() 'या @ कैमिकर' घुमावदार आइकन 'का उपयोग करके इसे पूरा करने का प्रयास करें। – trashgod

उत्तर

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); 
    } 
} 
+0

मैं समझता हूं कि सुराग ग्राफिक्स 2 डी का उपयोग करता है लेकिन उस उदाहरण में मुझे नहीं लगता कि इस छवि को ImageIcon ऑब्जेक्ट से कैसे पहुंचे। असल में, मैंने यह दिखाने के लिए मुख्य पोस्ट संपादित किया है कि मुझे कोशिश करने के लिए एक निष्कासन प्राप्त हुआ है। आपके सहयोग के लिए धन्यवाद। – davidgnin

+0

@ nin1987: मैंने ऊपर विस्तारित किया है। – trashgod

+0

ठीक है, मैं आपके सभी कोड को समझ नहीं पा रहा हूं और शायद यही कारण है कि मेरा विफल रहता है लेकिन कम से कम समस्या हल हो जाती है। मैंने अपनी पहली पोस्ट को नए कोड के साथ संपादित किया है और इसके साथ छवि घूमती है, लेकिन अज्ञात मूल छवि भी दिखायी जाती है। मैं एक नया BufferedImage (एक ही आकार और एक ही प्रकार) बनाने के लिए थक गया और वहां रोटेशन पेंट लेकिन यह काम नहीं करता है (पेंट केवल मूल unrotated छवि)। – davidgnin

3

के बाद से समाधान है कि मैंने पाया काम नहीं करता है या मैं उन्हें

समझ में नहीं आता खैर, अगर आप उन्हें समझ में नहीं आता, तो आप अपने SSCCE (http पोस्ट करना चाहिए: //sscce.org) अपना टेस्ट कोड प्रदर्शित करना। तो शायद कोई यह समझाने में सक्षम होगा कि कोड कैसे काम करता है।

मुझे संदेह है कि आप किसी भी नए कोड को समझने में सक्षम होंगे क्योंकि हम रोटेशन की अवधारणाओं को एक छवि या आइकन समान बना सकते हैं।

मैं setBounds कर छवि स्थिति कर रहा हूँ के बाद से JLabel

पर तुम क्यों setBounds उपयोग कर रहे हैं()। आपको लेआउट मैनेजर का उपयोग करना चाहिए ताकि आपको इसके बारे में चिंता न करें।

संपादित करें:

शायद तुम एक Rotated Icon उपयोग कर सकते हैं।

+0

मुझे वॉलीबॉल कोर्ट दिखाना है जिसमें खिलाड़ियों को अंदर घुमाने, घूर्णन करने, स्प्राइट बदलने आदि के साथ दिखाना है। फिर मुझे हर समय पूर्ण पदों के साथ काम करना होगा। इस स्थिति में मुझे लगता है कि सेटलाउट (शून्य) एक अच्छा विकल्प है, अगर मैं गलत हूं तो मुझे सही करें। – davidgnin

+0

हालांकि, मैंने कुछ उदाहरणों के साथ मुख्य पोस्ट संपादित किया (मुझे उम्मीद है कि इसे एसएससीसीई: डी माना जा सकता है) मेरी समस्या का वर्णन। धन्यवाद। – davidgnin

+0

@ nin1987, आप एसएससीसीई पर कैसे विचार करेंगे? यह कोड संकलित कैसे है? मेरा संपादन देखें। – camickr

संबंधित मुद्दे