2017-06-08 14 views
0

JPanelの名前「imagePanel」とボタン名「browseBtn」があります。すべてがJFrameクラスに含まれています。 browseBtnを押すと、ファイル選択が開き、PNG画像ファイルを選択すると、imagePanelに画像が直接表示されます。JPanelで画像が読み込まれない

これはbrowseBtn

private void browseBtnActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
     JFileChooser fc = new JFileChooser(); 
    int result = fc.showOpenDialog(null); 
    if (result == JFileChooser.APPROVE_OPTION) { 
     File file = fc.getSelectedFile(); 
     if (accept(file)) { 
      try { 
       ImageIcon image = new ImageIcon(file.getPath()); 
       JLabel l = new JLabel(image); 
       imagePanel.add(l); 
      } catch (Exception e) { 
       JOptionPane.showMessageDialog(this, "Error reading file !"); 
      } 
     } 
     else { 
      JOptionPane.showMessageDialog(this, "Choose png file only !"); 
     } 
    } 

}           

public boolean accept(File file) { 
    return file.isDirectory() || file.getAbsolutePath().endsWith(".png"); 
} 

のためのアクションイベントである私は、正しい.PNGファイルを選択しているが、画像がimagePanelに表示されませんでした理由を私は理解していません。あなたは男がそれについて説明できますか? 乾杯。

+0

1)まず最初に、 '新しいイメージアイコン(file.getPath());'最高の '新しいイメージアイコン(ファイル)でなければなりません;' 2)Dynamicall成分を添加していますトリッキー。私は起動時に 'JLabel'を追加して、単に' l.setIcon(..) 'を呼び出すことを提案します。 –

+0

ですが、ImageIcon(ファイル)を使用すると「ImageIcon(ファイル)に適切なコンストラクタが見つかりません」というエラーが発生します。 –

+0

D'Oh!私(そしてオラクル)は悪いです。何かが 'File'パスを表現することになっている時、***は***ファイルのコンストラクタを提供するべきです。 –

答えて

2

イメージを表示するたびに新しいオブジェクトを作成しないでください。イメージを5回変更した場合、オブジェクトを5回作成して1つしか表示しないと想像してください。

コメントのように、パネルを作成するときにラベルを作成し、パネルに追加し、画像を読み込むときにこのラベルのアイコンを変更するのがベストショットです。

 browseBtn.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JFileChooser fc = new JFileChooser(); 
      int result = fc.showOpenDialog(null); 
      if (result == JFileChooser.APPROVE_OPTION) { 
       File file = fc.getSelectedFile(); 
       if (accept(file)) { 
        try { 
         ImageIcon image = new ImageIcon(file.getPath()); 
         label.setIcon(image); 
        } catch (Exception ex) { 
         JOptionPane.showMessageDialog(this, "Error reading file !"); 
        } 
       } 
       else { 
        JOptionPane.showMessageDialog(this, "Choose png file only !"); 
       } 
      } 
     } 

     public boolean accept(File file) { 
      return file.isDirectory() || file.getAbsolutePath().endsWith(".png"); 
     } 


    }); 

ラベルは、コンポーネントの初期化時に作成された前記JLabelへの参照であると仮定します。

+0

私はそれを作った、ありがとう、しかし、私はフレームよりも大きな解像度で画像を選ぶとき、それは少し大きいようです、どうすればそれを制御することができますか? –

+1

さまざまなオプションがあります。最も簡単なのは、ラベルをスクロールペインに入れることです。もっと複雑なのは、画像のサイズを変更することです。さらに複雑なのは、イメージを使用可能なスペースにリサイズし、ユーザーがGUIを大きくまたは小さくドラッグするとイメージのサイズを変更することです。 –

0

それとも、これを試してみてください:

browseBtn.addActionListener(new ActionListener() { 
@Override 
public void actionPerformed(ActionEvent e) { 
    JFileChooser fc = new JFileChooser(); 
    int result = fc.showOpenDialog(null); 
    if (result == JFileChooser.APPROVE_OPTION) { 
    File file = fc.getSelectedFile(); 
    if (accept(file)) { 
    try { 
    ImageIcon imageIcon = new ImageIcon(new ImageIcon(file.getPath()).getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT)); //resizing 
    label.setIcon(imageIcon); 

    /*try { // or try this 
    InputStream inStream = this.getClass().getClassLoader().getResourceAsStream(file.getPath()); 
    BufferedImage img = ImageIO.read(inStream); 
    Image rimg = img.getScaledInstance(width, height, Image.SCALE_STANDARD); 
    label.setIcon(rimg); 
    } catch (IOException e) {}*/ 
    } catch (Exception ex) {JOptionPane.showMessageDialog(this, "Error reading file !");} 
    } else {JOptionPane.showMessageDialog(this, "Choose png file only !");} 
} 
} 
    public boolean accept(File file) { 
    return file.isDirectory() || file.getAbsolutePath().endsWith(".png"); 
    } 
}); 
関連する問題