2010-02-11 16 views
15

मैंने अपने जीयूआई में एक तस्वीर अपलोड की है जो जेएलएबल पर प्रदर्शित होता है। लेबल आयाम केवल 100,100 सेट है जबकि तस्वीर बहुत बड़ी है, इसलिए जब मैं इसे लेबल में अपलोड करता हूं तो यह विस्तारित होता है।जावा छवि आइकन आकार

क्या यह लेबल आकार में ऑटो आकार बदलने के लिए वैसे भी है?

नीचे, चित्र अपलोड करें JButton

class UploadHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     int returnVal = fc.showOpenDialog(frame2); 
     file = fc.getSelectedFile(); 
     pathname = file.getPath(); 
     icon = new ImageIcon(pathname); 
     lblDisPic.setIcon(icon);  
    } 
} 

btnUpload = new JButton("Upload Picture"); 
lblDisPic = new JLabel(); 
lblDisPic.setBorder(raisedetched); 
lblDisPic.setPreferredSize(d); 

btnUpload.addActionListener(new UploadHandler()); 

उत्तर

5

ज़रूर के लिए कार्रवाई श्रोता है सिर्फ paintComponent विधि ओवरराइड और आप पैमाने पर है और यह रंग के रूप में आप की तरह कर सकते हैं।

myLabel = new JLabel (/*whatever*/) { 

    @Override 
    public void paintComponent (Graphics g) { 
     super.paintComponent (g); 
     g.drawImage (myImageIcon.getImage(), 0, 0, getWidth(), getHeight(), null); 
    } 
}; 

here से स्रोत।

संपादित

अपने कोड बदलने के लिए जोड़ने के लिए:

lblDisPic = new JLabel(); 

करने के लिए:

lblDidPic = new JLabel() { 

    @Override 
    public void paintComponent (Graphics g) { 
     super.paintComponent (g); 
     if (icon != null) { 
      g.drawImage (icon.getImage(), 0, 0, getWidth(), getHeight(), null); 
     } 
    } 
}; 
+0

क्षमा करें, मुझे समस्या है कि मुझे समझ में आ रहा है कि एक असाधारण आंतरिक वर्ग क्या आप मुझे बता सकते हैं कि मैं इसे कैसे कार्यान्वित कर सकता हूं? – sutoL

+0

मैंने जवाब अपडेट किया है कि आप इसे कैसे कार्यान्वित कर सकते हैं। – Pool

+0

मेरे एक्शन लिस्टनर क्लास अपलोडहैंडलर के बारे में क्या? – sutoL

25

उदाहरण कोड को देखते हुए, एक दृष्टिकोण पर प्रदर्शित करने के लिए छवि का आकार करने के लिए है विधि से पहले JLabel कहा जाता है।

एक तरह से actionPerformed प्रक्रिया में परिवर्तन करना हो सकता है, इसलिए छवि निर्दिष्ट फ़ाइल से लोड किया जाएगा, ImageIO.read विधि का उपयोग कर छवि को पढ़ने के लिए है, तो छवि का आकार बदलने से पहले एक ImageIcon बनाई गई है।

Image img = ImageIO.read(fc.getSelectedFile()); 

फिर, भरी हुई छवि JLabel के आयाम को आकार दिया जा सकता, Image.getScaledInstance का उपयोग कर।

Image resizedImage = 
    img.getScaledInstance(lblDisPic.getWidth(), lblDisPic.getHeight(), null); 

अब, एक JLabel पर उपयोग करने के लिए एक ImageIcon बना सकते हैं।

lblDisPic.setIcon(new ImageIcon(resizedImage)); 

सीमा इस विधि के लिए, अगर JLabel किसी भी तरह से आकार दिया है, तो छवि JLabel द्वारा निहित आकार दिया जाता है कि नहीं किया जाएगा। हालांकि, JLabel मूल की स्केल-डाउन छवि का उपयोग करने जा रहा है, इसका मतलब यह होगा कि आवश्यक स्मृति की मात्रा कम हो जाएगी (यदि वह कोई चिंता हो) और मूल छवि को हर बार छवि का आकार बदलना नहीं होगा प्रदर्शित किया गया, जैसा कि paintComponent विधि को ओवरराइड करने वाला मामला होगा।

हाथ में कार्य प्राप्त करने की पसंदीदा विधि बाद में मूल छवि की आवश्यकता होने की आवश्यकता पर निर्भर करती है या नहीं।

+0

हैलो, हां, व्यक्ति की जानकारी प्रदर्शित करने के लिए छवि को फिर से जरूरी है। – sutoL

+7

मेरा मानना ​​है कि शून्य को Image.SCALE_FAST (या इसके किसी भी समेकित रूपों) के साथ प्रतिस्थापित किया जाना चाहिए। – sdasdadas

+0

या 'Image.SCALE_SMOOTH' जो छवि को अधिक चिकनी स्केल करने का प्रयास करता है (डॉकू कहता है:' एक छवि-स्केलिंग एल्गोरिदम चुनें जो स्केलिंग गति की तुलना में छवि चिकनीता को उच्च प्राथमिकता देता है।) –

2

आप आइकन पर ही paintIcon विधि रद्द कर सकते थे -

ImageIcon icon = new ImageIcon(...) { 

    @Override 
    public void paintIcon(Component c, Graphics g, int x, int y) { 
     g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c); 
    } 

    @Override 
    public int getIconHeight() { 
     // see below... 
    } 

    @Override 
    public int getIconWidth() { 
     // see below... 
    } 

}; 

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

मुझे एहसास हुआ कि जब लेबल का फैसला करता है, जहां x जगह उस छवि के मूल आकार को ध्यान में रखा जाता है , आइकन का वाई स्थान। आपको getIconWidth() को ओवरराइड करना होगा और IconHeight() विधियों को भी प्राप्त करना होगा।

हालांकि, लेबल आकार को वापस करने के लिए इन्हें ओवरराइड करने का कोई अच्छा तरीका नहीं है, क्योंकि इन विधियों के भीतर घटक का कोई संदर्भ नहीं है।

एक दृष्टिकोण एक नई कक्षा बनाना होगा जो ImageIcon बढ़ाता है और घटक को पास करता है - एक अच्छा विकल्प नहीं है क्योंकि यह एक आइकन के "कई घटकों के बीच पुन: प्रयोज्य" को तोड़ देता है।

एक और उपरोक्त के रूप में आंतरिक वर्ग में इन विधियों को ओवरराइड करना होगा, लेकिन किसी ऑब्जेक्ट फ़ील्ड के रूप में घटक को हार्डकोडेड संदर्भ दें, या final स्थानीय चर के रूप में। दोबारा, यह "कई घटकों के बीच पुन: प्रयोज्य" पहलू को तोड़ता है, और सामान्य रूप से थोड़ा "हैकी" लगता है, लेकिन जैसा कि यह एक-एक आंतरिक श्रेणी है, यह अनुमति हो सकती है।

0
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           

JFileChooser jFileChooser1=new JFileChooser(); 

int state = jFileChooser1.showOpenDialog(new JFrame());   
     jTextField1.setText(""); 

      if(state ==JFileChooser.APPROVE_OPTION) { 
     JOptionPane.showMessageDialog(
        null,null); 
     File file = jFileChooser1.getSelectedFile(); 
     s2=file.toString(); 
      jTextField1.setText(s2); 
     jLabel1=new JLabel(); 
    jLabel1.setName(s2); 
    jLabel1.setLocation(50,50); 
    jLabel1.setSize(300,300); 
    add(jLabel1); 

    BufferedImage bi1; 

    try 
    { 
     bi1=ImageIO.read(file); 
     ImageIcon icon1=new ImageIcon(bi1); 
     jLabel1.setIcon(icon1); 
     Image img = ImageIO.read(jFileChooser1.getSelectedFile()); 

     Image resizedImage = 
    img.getScaledInstance(jLabel1.getWidth(), jLabel1.getHeight(),Image.SCALE_DEFAULT); 
     jLabel1.setIcon(new ImageIcon(resizedImage)); 


    jLabel1.setBorder(BorderFactory.createLineBorder(Color.RED,5)); 


     pack(); 

    } 
    catch(Exception e) 
    { 
    System.out.println(e); 
    } 


    } 
    else if(state == JFileChooser.CANCEL_OPTION) { 
     JOptionPane.showMessageDialog(
        new JFrame(), "Canceled"); 
    } 
    pack();   

    } 
+0

यह फ़ाइलकोसर घटक दिखाएगा और पथ सेट करेगा jTextField1 में छवि और setIcon का उपयोग करके छवि प्रदर्शित करें .. और छवि को pedefined मानों में आकार बदलें .... इसलिए छवि को फसल और गलत नहीं मिलता है। – Rohit

+0

पहले के उत्तरों की तुलना में कुछ भी नया नहीं है ;-) – kleopatra

1

आप छवि रंग में तो रंग में उसके अनुसार अपना आकार सेट और फिर बचाने पर क्लिक करें और फिर छवि के एक ही आकार के अपने जावा आवेदन करने के लिए आ जाएगा संपादित कर सकते हैं।

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