2015-11-18 3 views
1
public class ShapeDisplayer implements ActionListener { 
    private static final int Width = 50; 
    private static final int Frame_Width = 400; 
    private static final int Frame_Height = 600; 
    static JPanel DrawPanel; 
    static JButton carButton; 
    static JButton eclipseButton; 
    static JButton compButton; 

    public static void main (String args[]) 
    { 
     // create frame 
     JFrame frame = new JFrame("Drawing Applet"); 

     // create panels 
     JPanel ButtonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
     DrawPanel = new JPanel(new BorderLayout()); 

     // create Icons 
     CarIcon Acar = new CarIcon(Width); 
     EclipseIcon doubleCircle = new EclipseIcon(20); 
     CompositeIcon compIcon = new CompositeIcon(50, 60); 

     // create buttons 
     carButton = new JButton(Acar); 
     eclipseButton = new JButton(doubleCircle); 
     compButton = new JButton(compIcon); 

     // panel config 
     ButtonPanel.setBounds(0,0,Frame_Width,100); 
     DrawPanel.setBounds(0,100,Frame_Width,Frame_Height-100); 

     // add panels'components 
     ButtonPanel.add(eclipseButton); 
     ButtonPanel.add(carButton); 
     ButtonPanel.add(compButton); 

     // add frames' components 
     frame.add(ButtonPanel); 
     frame.add(DrawPanel); 

     // frame config 
     frame.setSize(Frame_Width, Frame_Height); 
     frame.setLayout(new BorderLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 

     if (e.getSource() == carButton) 
     { 
      DrawPanel.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent e) { 
        CarIcon car = new CarIcon(Width, e.getX(), e.getY()); 
        JLabel lable = new JLabel (car); 
        DrawPanel.add(lable); 
       } 
      });  
     } 

    } 
} 

Im essayant d'en œuvre ce programme pour tirer sur le panneau mouseclick, par exemple, si le bouton est carButton, puis chaque fois que je clique sur le panneau, une icône de voiture sera dessiné. J'ai implémenté l'écouteur, mais quand je clique sur le panneau, rien n'apparaît sur le panneau. J'ajoute l'écouteur sur le Jframe, dois-je l'ajouter sur le Jpanel pour que le programme fonctionne correctement? Quelqu'un peut-il aider à réparer ce programme, merci d'avance.Mettre en œuvre de l'auditeur ne fonctionne pas

enter image description here

+1

Vous ajoutez jamais l'auditeur à quoi que ce soit –

+0

en fait je ne sais pas comment faire, ai-je besoin d'utiliser la classe anonyme? – KhoaVo

Répondre

2

La méthode actionPerformed ne sont pas Invoqué lorsqu'un bouton est cliqué. Parce qu'il n'est lié à aucun des boutons. Par exemple, le carButton peut être ajouté à un écouteur d'actions comme suit.

carButton = new JButton(Acar); 
carButton.addActionListener(new ShapeDisplayer()); 

Notez que ce code est la principale méthode «ce » ne peut pas être utilisé pour ajouter un écouteur d'action. Un nouvel objet de la classe ShapeDisplayer doit être instancié.

Le DrawPanel peut également avoir besoin d'être repeint pour que les modifications prennent effet. L'appel de la méthode revalidate fait cela.

DrawPanel.addMouseListener(new MouseAdapter() { 
    public void mouseClicked(MouseEvent e) { 
     CarIcon car = new CarIcon(Width, e.getX(), e.getY()); 
     JLabel lable = new JLabel (car); 
     DrawPanel.add(lable); 
     DrawPanel.revalidate(); 
    } 
}); 
+0

J'ai essayé d'ajouter cette ligne que vous mentionnez ci-dessus 'carButton.addActionListener (new ShapeDisplayer());' mais j'ai reçu ce message d'erreur 'La méthode addActionListener (ActionListener) dans le type AbstractButton n'est pas applicable pour les arguments (new ShapeDisplayer() {}) ' – KhoaVo

+0

L'erreur signalée se produit si vous tentez d'ajouter une instance qui n'implémente pas l'interface ActionListener en tant qu'actionListener. Y a-t-il eu des changements aux interfaces implémentées par la classe ShapeDisplayer? –

+0

désolé j'ai résolu ce problème – KhoaVo