2010-02-11 45 views
15

Tôi đã tải ảnh lên GUI của tôi hiển thị trên nhãn JLabel. Kích thước nhãn được đặt chỉ 100.100 trong khi hình ảnh lớn hơn nhiều, vì vậy khi tôi tải nó lên nhãn nó mở rộng.Kích thước Java ImageIcon

Có cách nào để biến nó tự động đổi kích thước thành kích thước nhãn không?

Dưới đây là người nghe hành động Upload Ảnh 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()); 

Trả lời

5

Chắc chắn, chỉ cần ghi đè lên các phương pháp paintComponent và bạn có thể mở rộng và sơn nó như bạn muốn.

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

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

Nguồn từ here.

EDIT

Để thêm vào sự thay đổi mã của bạn:

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

xin lỗi, tôi đang gặp sự cố khi hiểu lớp học bên trong anoymous có thể cho tôi biết làm cách nào để triển khai? – sutoL

+0

Tôi đã cập nhật câu trả lời với cách bạn có thể triển khai câu trả lời. – Pool

+0

Điều gì về lớp ActionListener của tôi UploadHandler? – sutoL

25

Với mã ví dụ, một cách tiếp cận là để thay đổi kích thước hình ảnh để hiển thị trên JLabel trước khi gọi phương thức setIcon.

Một cách có thể thay đổi phương thức actionPerformed, do đó hình ảnh sẽ được tải từ tệp được chỉ định, sử dụng phương pháp ImageIO.read để đọc hình ảnh, sau đó thay đổi kích thước hình ảnh trước khi tạo ImageIcon.

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

Sau đó, hình ảnh được tải có thể được thay đổi kích cỡ để kích thước của JLabel, sử dụng Image.getScaledInstance.

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

Bây giờ, bạn có thể tạo ImageIcon để sử dụng trên JLabel.

lblDisPic.setIcon(new ImageIcon(resizedImage)); 

Hạn chế phương pháp này là, rằng nếu JLabel được thay đổi kích cỡ trong bất kỳ cách nào, sau đó hình ảnh chứa đựng bởi JLabel sẽ không được thay đổi kích cỡ. Tuy nhiên, vì JLabel sẽ sử dụng hình ảnh thu nhỏ của ảnh gốc, điều đó có nghĩa là lượng bộ nhớ cần thiết sẽ giảm (nếu đó là mối quan tâm) và hình ảnh gốc sẽ không bị thay đổi kích thước mỗi khi ảnh đang được được hiển thị, như trường hợp có trọng số là phương pháp paintComponent.

Phương pháp ưu tiên để đạt được nhiệm vụ trong tay sẽ phụ thuộc vào các yêu cầu về việc liệu hình ảnh ban đầu có cần thiết sau này hay không.

+0

Xin chào, có hình ảnh là cần thiết một lần nữa để hiển thị thông tin của người đó. – sutoL

+7

Tôi tin rằng null nên được thay thế bằng Image.SCALE_FAST (hoặc bất kỳ biến thể được liệt kê nào của nó). – sdasdadas

+0

Hoặc 'Image.SCALE_SMOOTH' cố gắng mở rộng hình ảnh mịn hơn (Docu nói:' Chọn thuật toán chia tỷ lệ hình ảnh cho độ ưu tiên hình ảnh cao hơn tốc độ chia tỷ lệ.') –

2

Bạn có thể ghi đè lên các phương pháp paintIcon vào biểu tượng riêng của mình -

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... 
    } 

}; 

Edit -

tôi nhận ra rằng kích thước gốc của hình ảnh được đưa vào tài khoản khi Label quyết định nơi để đặt các x , y vị trí của biểu tượng. Bạn cũng sẽ cần ghi đè phương thức getIconWidth() và getIconHeight().

Tuy nhiên, không có cách nào tốt để ghi đè chúng để trả lại kích thước nhãn, vì không có tham chiếu đến chính thành phần trong các phương pháp này.

Một cách tiếp cận sẽ là tạo một lớp mới mở rộng ImageIcon và chuyển thành phần trong - không phải là lựa chọn tuyệt vời vì điều này phá vỡ các khía cạnh "có thể sử dụng lại giữa nhiều thành phần" của Biểu tượng.

Một cách khác là chỉ ghi đè các phương thức này trong lớp bên trong như trên, nhưng đặt tham chiếu được mã hóa cứng vào thành phần dưới dạng trường đối tượng hoặc dưới dạng biến cục bộ final. Một lần nữa, điều này phá vỡ khía cạnh "có thể tái sử dụng giữa nhiều thành phần", và có vẻ hơi "hacky" nói chung, nhưng vì nó là một lớp bên trong một lần, điều này có thể được cho phép.

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

điều này sẽ hiển thị thành phần filechooser và sẽ thiết lập đường dẫn hình ảnh trong jTextField1 và hiển thị hình ảnh bằng cách sử dụng setIcon ..và thay đổi kích thước hình ảnh thành giá trị được xác định .... vì vậy hình ảnh không bị cắt và sai. – Rohit

+0

không có gì mới so với câu trả lời trước đó, là có ;-) – kleopatra

1

Nếu bạn có thể chỉnh sửa hình ảnh trong sơn, sau đó đặt kích thước tương ứng trong sơn và sau đó nhấp vào lưu và sau đó cùng kích thước hình ảnh sẽ đến ứng dụng JAVA của bạn.

Các vấn đề liên quan