2012-03-15 19 views
1

問題があります。 JButtonをクリックしてイメージを表示する方法がわかりません。クリックして画像を表示JButton

私は画像を表示し、非表示にすることができますクラスを持っている:

/** 
* 
*/ 
package com.samples; 

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 

/** 
* @author 
* 
*/ 
public class New2 extends JFrame implements ActionListener { 

    private static String SHOW_ACTION = "show"; 
    private static String HIDE_ACTION = "hide"; 

    private Image image = null; 
    private boolean showImage = false; 

    public New2(String filename) { 
     setTitle("MyWindow"); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setSize(800, 600); 

     this.image = new ImageIcon("..//src/img/Ster.png").getImage(); 

     Container container = getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(createControls(), BorderLayout.SOUTH); 
    } 

    private JPanel createControls() { 
     JButton showButton = new JButton("Show"); 
     showButton.addActionListener(this); 
     showButton.setActionCommand(SHOW_ACTION); 

     JButton hideButton = new JButton("Hide"); 
     hideButton.addActionListener(this); 
     hideButton.setActionCommand(HIDE_ACTION); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new FlowLayout(FlowLayout.CENTER)); 

     panel.add(showButton); 
     panel.add(hideButton); 

     return panel; 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 

     if (showImage) { 
      g.drawImage(image, 100, 200, image.getWidth(null), image.getHeight(null), null); 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
     String actionCommand = event.getActionCommand(); 

     if (SHOW_ACTION.equals(actionCommand)) { 
      showImage = true; 
     } else if (HIDE_ACTION.equals(actionCommand)) { 
      showImage = false; 
     } 

     repaint(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       New2 frame = new New2("resources/image.jpg"); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

私はMVCで働いているので、私はコントローラの私のマップ内のJButton用のコードをしたいが、私はどのように知りませんこれを行う。

package View; 

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Image; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 


import Controller.HomeController; 
import Controller.KeeperController; 

public class Selectie extends JFrame{ 

    private JLabel label, label1, label2; 
    private JButton keeper; 
    private JPanel panel; 
    private Container window = getContentPane(); 
    private KeeperController controller; 


    public Selectie() 
    { 
     initGUI(); 

    } 

    public void initGUI() 
    { 
     setLayout(null); 
     setTitle(); 
     setSize(800,600); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     label = new JLabel();  
     label.setBounds(0, 0, 266, 800); 
     label.setBackground(Color.RED); 
     label.setOpaque(true); 
     window.add(label); 

     label1 = new JLabel(); 
     label1.setBounds(266, 0, 266, 800); 
     label1.setBackground(Color.BLACK); 
     label1.setOpaque(true); 
     window.add(label1); 

     label2 = new JLabel(); 
     label2.setBounds(532, 0, 266, 800); 
     label2.setBackground(Color.RED); 
     label2.setOpaque(true); 
     window.add(label2); 

     keeper = new JButton("1. "+""+" Kenneth Vermeer"); 
     keeper.setBounds(60, 500, 200, 25); 
     keeper.setFocusable(false); 
     keeper.setBorderPainted(false); 
     keeper.setContentAreaFilled(false); 
     keeper.setFont(new Font("Arial",Font.PLAIN,17)); 
     label.add(keeper); 

     } 

} 

ボタンをクリックすると、画像を表示する必要があります。

+0

を使うのか?その場合は、コントローラークラス( 'Controller.HomeController'、' Controller.KeeperController')と 'New2'を参照する必要があります。 –

+0

@lsmail:私は、ディレクトリ構造がどのようにしなければならないかを表す図と、パスに画像にアクセスする方法を追加しました。見てください:-) –

答えて

5

同様に、他の人は、JLabelを使用して画像を表示してください。そうすれば、ペイントするのではなく、必要なときにそれらを追加/削除するのは簡単です。さらに、あなたのコードでpaint(...)を無効にしています。Swingについては、該当するコンポーネントがある場合はJComponentpaintComponent(...)メソッドをオーバーライドすることをお勧めします。ここで

は、このコードを試してみてください、私はコントローラの一部を分離した、あなたは物事を行う方法のように、いくつかのアイデアを得る可能性があります:

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.Icon; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.WindowConstants; 

/** 
* @author 
* 
*/ 
public class New2 extends JFrame 
{ 

    private static String SHOW_ACTION = "show"; 
    private static String HIDE_ACTION = "hide"; 

    public New2(String filename) 
    { 
     setTitle("MyWindow"); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setSize(800, 600);   

     Container container = getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(createControls(), BorderLayout.CENTER); 
    } 

    private JPanel createControls() 
    { 
     JButton showButton = new JButton("Show");   
     showButton.setActionCommand(SHOW_ACTION); 

     JButton hideButton = new JButton("Hide");   
     hideButton.setActionCommand(HIDE_ACTION); 

     JLabel imageLabel = new JLabel(); 

     New2Controller n2c = new New2Controller(showButton 
                     , hideButton, imageLabel); 
     showButton.addActionListener(n2c);   
     hideButton.addActionListener(n2c); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new FlowLayout(FlowLayout.CENTER)); 

     panel.add(imageLabel); 
     panel.add(showButton); 
     panel.add(hideButton); 

     return panel; 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       New2 frame = new New2("/img/image.jpg"); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

class New2Controller implements ActionListener 
{ 
    private JButton showButton; 
    private JButton hideButton; 
    private JLabel imageLabel; 
    private static String SHOW_ACTION = "show"; 
    private static String HIDE_ACTION = "hide"; 
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon"); 

    public New2Controller(JButton show, JButton hide, JLabel label) 
    { 
     showButton = show; 
     hideButton = hide; 
     imageLabel = label; 
    } 

    public void actionPerformed(ActionEvent event) 
    { 
     String actionCommand = event.getActionCommand(); 

     if (SHOW_ACTION.equals(actionCommand)) 
     { 
      SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       {      
        imageLabel.setIcon(infoIcon); 
       } 
      }); 
     } 
     else if (HIDE_ACTION.equals(actionCommand)) 
     { 
      imageLabel.setIcon(null); 
     } 
    } 
} 

をこのコードは、ImageIOURL

を使用して読み取る方法を示してまた
import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 

import javax.imageio.ImageIO; 

/** 
 * @author 
 * 
 */ 
public class New2 extends JFrame 
{ 
    private static String SHOW_ACTION = "show"; 
    private static String HIDE_ACTION = "hide"; 

    public New2(String filename)  
    { 
        setTitle("MyWindow"); 
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
        setSize(800, 600);         

        Container container = getContentPane(); 
        container.setLayout(new BorderLayout()); 
        container.add(createControls(), BorderLayout.CENTER); 
    } 

    private JPanel createControls()  
    { 
        JButton showButton = new JButton("Show");         
        showButton.setActionCommand(SHOW_ACTION); 

        JButton hideButton = new JButton("Hide");         
        hideButton.setActionCommand(HIDE_ACTION); 

     JLabel imageLabel = new JLabel(); 

     New2Controller n2c = new New2Controller(showButton 
             , hideButton, imageLabel); 
     showButton.addActionListener(n2c);   
     hideButton.addActionListener(n2c); 

     JPanel panel = new JPanel(); 
        panel.setLayout(new FlowLayout(FlowLayout.CENTER)); 

     panel.add(imageLabel); 
        panel.add(showButton); 
        panel.add(hideButton); 

        return panel; 
    } 

    /** 
     * @param args 
     */ 
    public static void main(String[] args)  
    { 
     EventQueue.invokeLater(new Runnable()  
     { 
      @Override 
      public void run()  
      { 
       New2 frame = new New2("/img/image.jpg"); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

class New2Controller implements ActionListener 
{ 
    private JButton showButton; 
    private JButton hideButton; 
    private JLabel imageLabel; 
    private Image image; 
    private ImageIcon imageIcon; 
    private static String SHOW_ACTION = "show"; 
    private static String HIDE_ACTION = "hide"; 

    public New2Controller(JButton show, JButton hide, JLabel label) 
    { 
     showButton = show; 
     hideButton = hide; 
     imageLabel = label; 
     try 
     { 
      image = ImageIO.read(getClass().getResource("/img/caIcon.png")); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     imageIcon = new ImageIcon(image); 
    } 

    public void actionPerformed(ActionEvent event) 
    { 
     String actionCommand = event.getActionCommand(); 

        if (SHOW_ACTION.equals(actionCommand))  
     { 
      SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       {      
        imageLabel.setIcon(imageIcon); 
       } 
      }); 
     }  
     else if (HIDE_ACTION.equals(actionCommand))  
     { 
      imageLabel.setIcon(null); 
        } 
    } 
} 

、あなたはBorderLayoutのためNORTHEASTWESTSOUTHを使用することはありませんBorderLayoutを使用しています。それらはPAGE_START,LINE_START,LINE_ENDおよびPAGE_ENDにそれぞれ置き換えられました。

BorderLayoutオブジェクトには5つの領域があります。これらの領域は、BorderLayoutは定数で指定されています

  • PAGE_START
  • PAGE_END
  • LINESTART
  • LINE_END
  • CENTER

バージョン注:JDK 1.4をリリースする前に、優先しますさまざまな地域の名前は、コンパスのポイント(exaの場合mple、上部領域のBorderLayout.NORTH)を使用しています。例が使用する定数は、標準であり、プログラムが異なる方向を持つ言語に調整できるため、使用する定数が優先されます。

ディレクトリ構造:

       Your Project 
           |   | 
           classes  src 
           |  | 
          img *.class(or package Folder) 

今、あなたはクラス `New2`を必要とするか、それは一例に過ぎないでくださいgetClass().getResource("/img/star.png");

+1

イメージベースの例では、インターネット上で(URLで)ホットリンクするか、JREで使用するアイコンからプルすることができます。 –

+1

@AndrewThompson:Ahha、ええ、私はあなたが何度もそれをやっているのを見ていました:-)、それは良いことです。ちょうどあなたの頭はいつものように片方の方向に転がります。それはそうすることに慣れているからです。他の方向に向かって私の頭を回してくれてありがとう:-)そして、笑いを続ける:-) –

+0

* "それは何回もやっているのを見ました" * JREからアイコンを引っ張ることはmKorbelが私に見せた巧妙なトリックだが、常にどこを見つけるかの詳細を忘れています。 : –

2

JLableを追加するだけで画像を表示できます。その後、条件によってJLabelを設定することができます。

4

1)JFrame

2に背景として代わりに絵画像のJLabel#setIcon()を使用)class Selectie

private void setIconToLabel (Icon icon){ 

    myDesiredLabel.setIcon(icon); 
} 

3にメソッドを作成する)他の画像使用CardLayoutための新しいJFrameを作成しない

をinstaed
+0

@Ismail:これはこれまでのところ最高の答えです。 –

関連する問題