2012-03-15 6 views
1

J'ai un problème. Je ne sais pas comment afficher une image en cliquant sur un bouton JButton.Afficher l'image en cliquant sur JButton

J'ai une classe qui peut afficher et masquer une image:

/** 
* 
*/ 
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); 
      } 
     }); 
    } 
} 

Je travaille avec MVC alors je veux le code pour le JButton dans ma carte pour les contrôleurs, mais je ne sais pas comment fais ceci.

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); 

     } 

} 

Le détenteur de bouton doit afficher l'image lorsqu'il est cliqué.

+0

Avez-vous besoin de classe 'New2' ou est-ce juste un exemple? Dans ce cas, nous aurions plutôt besoin de voir les classes du contrôleur ('Controller.HomeController',' Controller.KeeperController') puis 'New2'. –

+0

@lsmail: J'avais ajouté le diagramme représentant, comment la structure de répertoire doit être, et comment le «chemin» devrait être pour accéder à une image. Jetez un oeil :-) –

Répondre

5

Comme il a été dit, d'autres utilisent toujours JLabel pour afficher des images. De cette façon, il est facile de les ajouter/les supprimer au besoin, au lieu de les peindre. En outre, dans votre code vous surchargez paint(...), pour Swing nous préférons remplacer la méthode paintComponent(...) du JComponent respectif si le composant en question en a un.

essayer ici ce code, j'avais séparé la partie du contrôleur, vous pourriez avoir une idée, quant à la façon de faire les choses:

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); 
     } 
    } 
} 

Ce code représente la façon dont vous lu à l'aide ImageIO et URL,

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); 
        } 
    } 
} 

de plus, lorsque vous utilisez BorderLayout ne jamais utiliser NORTH, EAST, WEST et SOUTH pour BorderLayout. Ils ont été remplacés par PAGE_START, LINE_START, LINE_END et PAGE_END respectivement.

Un objet BorderLayout a cinq zones. Ces zones sont spécifiées par les constantes de BorderLayout:

  • PAGE_START
  • PAGE_END
  • linestart
  • LINE_END
  • CENTRE

note Version: Avant libération JDK 1.4, le préféré noms pour les différentes zones étaient différents, allant des points cardinaux mple, BorderLayout.NORTH pour la zone supérieure) à des versions plus complètes des constantes que nous utilisons dans nos exemples.Les constantes utilisées par nos exemples sont préférées car elles sont standard et permettent aux programmes de s'adapter à des langages ayant des orientations différentes.

Structure du répertoire:

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

Maintenant, utilisez getClass().getResource("/img/star.png");

+1

Une bonne astuce avec des exemples basés sur l'image est de les relier à chaud sur Internet (par 'URL') ou de les extraire des icônes utilisées par le JRE. –

+1

@AndrewThompson: Ahha, ouais comme je vous avais vu faire ça plusieurs fois :-), c'est une bonne chose. Parfois, votre tête ne roule que dans une direction, comme d'habitude, puisqu'elle est habituée à le faire de cette façon. Merci d'avoir tourné la tête vers l'autre direction :-) et faites Keep Smiling :-) –

+0

* "Je vous ai vu faire tant de fois" * Tirer les icônes du JRE est un truc intelligent que mKorbel m'a montré, mais je suis oubliant toujours les détails de l'endroit où les trouver. :( –

2

Vous pouvez simplement ajouter un JLable pour afficher l'image dessus. Après cela, vous pouvez définir JLabelVisible en fonction de la condition.

4

1) utiliser JLabel#setIcon() à la place de l'image de la peinture comme toile de fond à la JFrame

2) créer des méthodes dans class Selectie

private void setIconToLabel (Icon icon){ 

    myDesiredLabel.setIcon(icon); 
} 

3) ne créent pas une nouvelle JFrame pour une autre utilisation de l'image CardLayout instaed

+0

@Ismail: c'est la meilleure réponse jusqu'à présent. –

Questions connexes