2010-02-11 73 views
15

我已經上傳了一張圖片到我的GUI上,它顯示在JLabel上。標籤尺寸僅設置爲100,100,而圖片更大,因此當我將其上傳到標籤時,它會展開。Java ImageIcon大小

無論如何,它會自動調整到標籤大小?

下面是上傳圖片的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

我的actionListener類UploadHandler呢? – sutoL

25

給出的示例代碼,一個辦法是調整顯示的圖像在調用setIcon方法之前調用JLabel

的一種方法是改變actionPerformed方法,因此圖像會從指定的文件被加載,使用ImageIO.read方法讀取的圖像,然後調整大小圖像創建一個ImageIcon之前。

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

然後,所加載的圖像可使用Image.getScaledInstance被調整到JLabel的尺寸。現在

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

,一個可以創建一個ImageIconJLabel使用。

lblDisPic.setIcon(new ImageIcon(resizedImage)); 

的限制這種方法,如果JLabel以任何方式被調整大小,然後由JLabel包含在圖像將不會被調整大小。但是,由於JLabel將使用縮小的原始圖像,這意味着所需的內存量將減少(如果擔心的話)和原始圖像在每次圖像時都不需要調整大小顯示,如覆蓋paintComponent方法的情況。

實現手頭任務的首選方法將取決於原始圖像是否需要在晚些時候需要的要求。

+0

你好,是的,圖像是需要再次顯示該人的信息。 – sutoL

+7

我相信null應該被替換Image.SCALE_FAST(或其任何枚舉​​變體)。 – sdasdadas

+0

或'Image.SCALE_SMOOTH'試圖縮放圖像更平滑(Docu說:選擇一個圖像縮放算法,給予圖像平滑度比縮放速度更高的優先權。) –

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原始尺寸是考慮到,圖標的y位置。您還需要重寫getIconWidth()和getIconHeight()方法。

但是,沒有一種方法可以重寫這些參數來返回標籤大小,因爲在這些方法中沒有引用組件本身。

一種方法是創建一個擴展ImageIcon並將組件傳入的新類 - 這不是一個好選擇,因爲這打破了圖標的「多個組件之間可重複使用」方面。

另一種方法是在上面的內部類中重寫這些方法,但將組件的硬編碼引用作爲對象字段或作爲局部變量使用。再次,這打破了「在許多組件之間可重複使用」的方面,一般來說似乎有點「黑客」,但由於它是一次性的內部類,所以這可能是可以允許的。

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

這將顯示filechooser組件,並將設置路徑圖像在jTextField1和顯示圖像使用setIcon ..並調整圖像pedefined值...所以圖像不會裁剪和錯誤。 – Rohit

+0

與先前的答案相比沒什麼新意,是否有;-) – kleopatra

1

如果您可以編輯圖像中的油漆,然後在漆相應地設置其大小,然後點擊保存,然後圖像同樣大小將來到你的Java應用程序。