2013-04-14 4 views
0

Alors j'essayais de créer deux boutons pour une interface, j'ai essayé d'implémenter ActionListener pour activer l'un des boutons pour imprimer une chaîne mais ça m'a donné une erreur qui disait que "actionlistener wasn ' t implémenté dans la classe BorderDemo "Implémentation d'Actionlistener dans une interface graphique RTP

Qu'ai-je fait de mal?

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferStrategy; 
class BorderDemo 
implements ActionListener 
{ 
public static void main (String[] args) 
{ 
JFrame F = new JFrame("Buttons"); 
F.addWindowListener 
(new WindowAdapter() 
{ 
public void windowClosing(WindowEvent e) 
{ 
System.exit(0); 
}}); 
F.setSize(544,416); 
JPanel pane = (JPanel) F.getContentPane(); 
pane.add(new Picture(),BorderLayout.CENTER); 
pane.add(new JButton("Start"),BorderLayout.WEST); 
pane.addActionListener(this); 
pane.add(new JButton("Stop"),BorderLayout.EAST); 
F.setVisible(true); 
F.setResizable(false); 
} 
} 
class Picture extends JComponent 
{ 
public Picture() 
{ 
repaint(); 
} 

public void paint (Graphics g) 
{ 
g.setColor(Color.yellow); 
g.fillOval(getWidth()/4,getHeight()/4, 
getWidth()/2,getHeight()/3); 
g.setColor(Color.black); 
g.fillOval(getWidth()/2,getHeight()/4, 
getWidth()/17,getHeight()/3); 
g.setColor(Color.black); 
g.fillOval(getWidth()/3,getHeight()/4, 
getWidth()/17,getHeight()/3); 
g.setColor(Color.white); 
g.fillOval(getWidth()/5,getHeight()/5, 
getWidth()/5,getHeight()/7); 
g.setColor(Color.white); 
g.fillOval(getWidth()/3,getHeight()/8, 
getWidth()/5,getHeight()/7); 
} 
public void actionPerformed(ActionEvent e) { 
     System.out.println("Item clicked: "+e.getActionCommand()); 
} 
} 
+2

1) Utilisez un tiret cohérent et logique pour les blocs de code. L'indentation du code a pour but d'aider les gens à comprendre le déroulement du programme. 2) Apprenez s'il vous plaît les conventions communes de nommage Java (http://java.sun.com/docs/books/jls/second_edition/html/names.doc).html # 73307) (en particulier le cas utilisé pour les noms) pour les noms de classe, méthode et attribut et l'utiliser de manière cohérente. –

Répondre

1

On dirait actionPerformed est ajouté à Picture classe au lieu de BorderDemo. Donc, si vous le déplacez dans BorderDemo il devrait résoudre l'erreur mentionnée.

La cause de l'erreur est le fait que BorderDemo est déclarée comme la mise en œuvre ActionListener Interface:

class BorderDemo implements ActionListener 

Cependant, il ne met pas. Ajouter une méthode actionPerformed définie dans ActionListener, à savoir:

@Override 
public void actionPerformed(ActionEvent arg0) { 
} 

Jetez un oeil à Implementing an Interface tutoriel. Voir aussi How to Write an Action Listener.

Quelques commentaires mineurs:

  1. Vous ne voulez probablement ajouter des écouteurs d'action aux boutons, plutôt que JPanel. JPanel n'accepte pas les écouteurs d'actions.

  2. Au lieu d'ajouter écouteur de fenêtre sur le cadre pour quitter l'application sur vous fermeture pouvez utiliser:

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  3. Au lieu de définir la taille de cadre avec setSize(544, 416); mettre en œuvre getPrefferedSize() dans Picture et appeler pack(); sur le cadre .

  4. Dans la classe Picture, ne remplacez pas paint(), remplacez paintComponent(). Aussi, n'oubliez pas d'appeler le super.paintComponent() dans votre implémentation. Voir Performing Custom Painting. Assurez-vous de créer un composant d'interface utilisateur sur le Thread d'envoi d'événement en utilisant invokeLater(). Voir Initial Threads.

  5. Comme déjà mentionné dans les commentaires ci-dessus, la lisibilité du code est très importante. Voir Code Conventions for the Java Programming Language pour plus de détails et d'exemples.

EDIT: exemple basé sur le code affiché qui fonctionne sur OK dans RTP 1,7

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 


class BorderDemo { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 

    public static void createAndShowUI() { 
     JFrame frame = new JFrame("Buttons"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton startButton = new JButton("Start"); 
     startButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Start clicked"); 
      } 
     }); 
     JButton stopButton = new JButton("Stop"); 
     stopButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Stop clicked"); 
      } 
     }); 

     Container contentPane = frame.getContentPane(); 
     contentPane.add(new Picture(), BorderLayout.CENTER); 
     contentPane.add(startButton, BorderLayout.WEST); 
     contentPane.add(stopButton, BorderLayout.EAST); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.setResizable(false); 
    } 

    static class Picture extends JComponent { 
     public Picture() { 
     } 

     public Dimension getPreferredSize() { 
      return new Dimension(544, 416); 
     } 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      g.setColor(Color.yellow); 
      g.fillOval(getWidth()/4, getHeight()/4, getWidth()/2, 
        getHeight()/3); 
      g.setColor(Color.black); 
      g.fillOval(getWidth()/2, getHeight()/4, getWidth()/17, 
        getHeight()/3); 
      g.setColor(Color.black); 
      g.fillOval(getWidth()/3, getHeight()/4, getWidth()/17, 
        getHeight()/3); 
      g.setColor(Color.white); 
      g.fillOval(getWidth()/5, getHeight()/5, getWidth()/5, 
        getHeight()/7); 
      g.setColor(Color.white); 
      g.fillOval(getWidth()/3, getHeight()/8, getWidth()/5, 
        getHeight()/7); 
     } 
    } 
} 
+0

Merci pour la réponse, mais j'ai d'autres questions: tous les codes que vous suggérez sont-ils disponibles dans le programme Ready To Program? (Version 1.7) –

+0

@LongVuTa RTP est-il lié à une version particulière de Java? – tenorsax

+0

@LongVuTa semble que RTP 1.7 utilise Java 1.4, vous devriez donc pouvoir implémenter toutes les suggestions. Voir une modification pour un exemple. – tenorsax

Questions connexes