2011-07-19 29 views
0

JPanel(画像パネル---黒い枠線)のサイズに合わせようとしていますパネル")。アップロードボタンをクリックすると、新しいJFrameでJFilechooserが表示され、必要な画像を選択できますが、「開く」ボタンをクリックしても何も起こりません。画像をJFileChooserから選択した画像をJPanel(画像のサイズを変更する必要があります)

import classes.BackgroundPanel; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.*; 
import javax.swing.*; 
import javax.imageio.ImageIO; 
import javax.swing.filechooser.FileNameExtensionFilter; 


public class Test 
{ 

    public static void main(String[] args) { 
     final JFileChooser chooser = new JFileChooser(); 
     JButton button = new JButton(); 
     button.setText("Upload"); 
     JFrame frame = new JFrame("My Frame"); 
     final JFrame imageFrame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JFileChooser fc = new JFileChooser(); 
     final Test_Image t = new Test_Image(); 
     JPanel panel = new JPanel(); 
     JPanel picturePanel = new JPanel(); 
    // chooser.showOpenDialog(null); 
      Dimension d = new Dimension(1261, 765); 
      Dimension d2 = new Dimension(1300, 900); 
      picturePanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); 
      panel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); 
      Dimension d3 = new Dimension(343, 247); 
      picturePanel.setSize(d3); 
      //picturePanel.setSize(d); 
      panel.add(button); 
      panel.setSize(d3); 


     //panel.setVisible(true); 
     //panel.add(picturePanel); 

     button.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) 
      { 
       if(chooser.showOpenDialog(imageFrame) == JFileChooser.APPROVE_OPTION) { 

        try { 
         Image bi = ImageIO.read(
         chooser.getSelectedFile()); 
         BackgroundPanel bp = new BackgroundPanel(bi); 
         if (bi != null) 
         bp.setImage(bi); 
         else 
         JOptionPane.showMessageDialog(imageFrame, 
         "File is not an image!"); 
         } catch (IOException ioe) { 
         JOptionPane.showMessageDialog(imageFrame, 
         "Error Reading File!"); 
}     
       }        

      } 
     });  


     frame.setSize(d2); 
     frame.add(picturePanel).setLocation(100, 100); 
     frame.add(panel); 
     frame.setVisible(true); 

    } 

} 
+0

「BackgroundPanel」とは何ですか? – Nivas

+0

私はあなたのイメージをBackgroundPanelで描画し、適切なdrawImageオーバーロードを使って必要に応じてサイズを変更することを前提としています - 正しい(BackgroundPanelのコードを表示するといいでしょう)? BackgroundPanel、bpをpicturePanelやその他の場所に追加する場所はどこですか? –

+0

@Nivas、['BackgroundPanel'](http://tips4java.wordpress.com/2008/10/12/background-panel/)は@camickrによって作成されたカスタムクラスです。 – Moonbeam

答えて

0
BackgroundPanel bp = new BackgroundPanel(bi); 

あなたはどこにでもフレームにBackgroundPaneを追加しないでください。コンポーネントを動的に追加するための基本的なコードは次のとおりです。

panel.add(someComponent); 
panel.revalidate(); 
panel.repaint(); 

すでにフレームにBackgroundPanelを追加した場合、あなただけのパネルにsetImage()メソッドを呼び出すことができるはずです。これで、ImageIO.read(...)を使用してコードチューザからパスを選択した後で画像を読み込むコードを変更する必要があります。

+0

私はボタンアクションリスナメソッドの中にいないと私はbpにアクセスできないので、ボタンアクションが実行された後にバックグラウンドパネルを追加しますか? – Warz

+0

匿名の内部クラスをリスナーに使用する必要はありません。別のActionListenerクラスを作成し、そのクラスを作成するときにBackgroundPanelへの参照を渡すことができます。これで、リスナーはパネルにアクセスできます。 – camickr

0

ここでも、picturePanel JPanelにBackgroundPanelを追加する場所は表示されません。 picturePanelのレイアウトをBorderLayoutに設定し、BorderLayout.CENTER位置のpicturePanelにBackgroundPanel、bpを追加し、camickrが示すようにrevalidateとrepaintを呼び出す必要があります。

私たちがリクエストしたとしても、BackgroundPanelクラスのコードは表示されません。繰り返しますが、paintComponentメソッドでイメージを描画し、適切なdrawImageオーバーロードを使用することを願っていますが、コードを表示するまではわからないでしょう。

+0

背景パネルクラスはこちら(http://tips4java.wordpress.com/2008/10/12/background-panel/)。助けてくれてありがとう。私はボタンのクリックアクションイベントメソッドの中でこれらのステップをすべて正しく実行できますか? – Warz

+0

@ワルツ:それを試して調べるのがベストです。 –

+0

バックグラウンドパネル 'bp'で画像を正しく設定し、BorderLayout.Centerを位置として使用してpicturePanelにbpを追加した後、picturePanel.revalidateを呼び出して後で再描画しても画像を表示できません。パスが見つかったこととイメージサイズがあることを示すprint文があります。 – Warz

関連する問題