2017-06-20 8 views
-1

J'apprends toujours à coder en Java et je pourrais utiliser un peu d'aide en ce moment.Plusieurs boutons faisant quelque chose

C'est le code que j'ai écrit. Comme vous pouvez le voir, c'est un panneau simple avec un tas de boutons et un curseur. Je veux faire une sortie de console différente chaque fois que j'appuie sur un bouton différent. Donc, si je tape Back, il est supposé écrire Back dans la console. Si je défile un peu sur le curseur, il est supposé écrire la nouvelle valeur dans la console. Des trucs comme ça. Je sais que cela doit être fait avec actionListener et actionPerformed, mais après quelques expériences, je ne pouvais pas le faire fonctionner.

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

public class Gui implements ActionListener { 

// Adding all the goods 
JFrame frame; 
JPanel panel; 
JButton endButton; 
JButton backButton; 
JButton calcButton; 
JSlider maxIterations; 
JLabel view; 

Gui() { 

// General 
this.frame = new JFrame("Trying my best, I swear"); 
this.frame.setSize(500, 500); 
this.frame.setVisible(true); 
this.panel = new JPanel(); 

// Buttons 
this.backButton = new JButton("Back"); 
this.calcButton = new JButton("Calc"); 
this.endButton = new JButton("End"); 
this.panel.add(this.endButton); 
this.panel.add(this.calcButton); 
this.panel.add(this.backButton); 
this.frame.add(this.panel); 

// Label 
JLabel label1 = new JLabel(); 
label1.setText("Space Holer"); 
panel.add(label1); 

// Slider 
JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 30, 15); 
panel.add(slider); 
slider.setMinorTickSpacing(2); 
slider.setMajorTickSpacing(5); 
slider.setPaintTicks(true); 
slider.setPaintLabels(true); 

// Make the buttons do something 
this.endButton.addActionListener(this); 
} 

public void actionPerformed(ActionEvent ae) { 
System.out.println("End"); 
} 


public static void main(String[] args) { 
    @SuppressWarnings("unused") 
    Gui m = new Gui(); 
    } 
} 

Répondre

0

besoin d'ajouter ActionListener à tous les boutons,

calcButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("calcButton"); 
      // calculation for slider. 
      } 
     }); 

     backButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("backButton"); 
      } 
     }); 

alors u obtenir la sortie de la console différente.

0

Appelez setVisible sur jframe après avoir placé tous les composants.

Ajoutez ActionListener à chaque bouton. Ajouter ChangeListener au curseur car il ne peut pas avoir ActionListener.

Voir code complet:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 

public class Gui implements ActionListener { 

    // Adding all the goods 
    JFrame frame; 
    JPanel panel; 
    JButton endButton; 
    JButton backButton; 
    JButton calcButton; 
    JSlider maxIterations; 
    JLabel view; 

    Gui() { 

     // General 
     this.frame = new JFrame("Trying my best, I swear"); 
     this.frame.setSize(500, 500); 
     this.panel = new JPanel(); 

     // Buttons 
     this.backButton = new JButton("Back"); 
     this.calcButton = new JButton("Calc"); 
     this.endButton = new JButton("End"); 
     this.panel.add(this.endButton); 
     this.panel.add(this.calcButton); 
     this.panel.add(this.backButton); 
     this.frame.add(this.panel); 

     // Label 
     JLabel label1 = new JLabel(); 
     label1.setText("Space Holer"); 
     panel.add(label1); 

     // Slider 
     JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 30, 15); 
     panel.add(slider); 
     slider.setMinorTickSpacing(2); 
     slider.setMajorTickSpacing(5); 
     slider.setPaintTicks(true); 
     slider.setPaintLabels(true); 

     // Make the buttons do something 
     this.endButton.addActionListener(this); 
     this.backButton.addActionListener(this); 
     this.calcButton.addActionListener(this); 
     slider.addChangeListener(e -> { 
      Object source = e.getSource(); 
      if (source instanceof JSlider) { 
       int value = ((JSlider) source).getValue(); 
       System.out.println(value); 
      } 
     }); 
     frame.pack(); 
     this.frame.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent ae) { 
     Object source = ae.getSource(); 
     if (source instanceof JButton) { 
      String text = ((JButton) source).getText(); 
      System.out.println(text); 
     } 
    } 

    public static void main(String[] args) { 
     @SuppressWarnings("unused") 
     Gui m = new Gui(); 
    } 
} 
1

Vous pourriez ...

Profitez de la propriété actionCommand du bouton, qui est réglé sur le ActionEvent lors de sa création. Si vous ne fournissez pas un actionCommand au bouton vous, il sera par défaut à la valeur text, vous pouvez donc faire quelque chose comme

public class ButtonActionHandler implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     switch (e.getActionCommand()) { 
      case "Back": 
       System.out.println("Back"); 
       break; 
      case "Calc": 
       System.out.println("Calc"); 
       break; 
      case "End": 
       System.out.println("End"); 
       break; 
     } 
    } 

} 

Ce qui est bon si le ActionListener est extérieur à la classe où les boutons sont définis , parce que vous n'aurez pas accès aux références des boutons. Il est également bon, parce que vous pourriez avoir un certain nombre de boutons (y compris les boutons de la barre d'outils et éléments de menu) qui font la même chose

Vous pourriez ...

Faire usage de la propriété de sourceActionListener

public class ButtonActionHandler implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == backButton) { 
      System.out.println("Back"); 
     } else if (e.getSource() == calcButton) { 
      System.out.println("Calc"); 
     } else if (e.getSource() == endButton) { 
      System.out.println("End"); 
     } 
    } 

} 

Ceci est utile si le ActionListener dans défini comme une classe interne à la classe parente où les boutons sont définis

Vous pourriez ...

Utilisez une classe anonyme enregistrée directement sur le bouton ...

endButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("End"); 
    } 
}); 

Ce qui est bon lorsque le bouton fait une seule tâche isolée

Vous pourriez ...

Faire usage de l'API Action qui vous permet de définir une unité de travail autonome, qui peut être utilisée par les boutons pour se configurer complètement à partir de celle-ci. Ceci est utile lorsque vous avez une action répétée qui peut être exécutée à partir de différents emplacements de l'interface utilisateur, comme une action «ouvrir un fichier» contenue dans la barre de menus, la barre d'outils et un assistant.Vous pouvez même l'utiliser avec l'API de raccourcis clavier pour des fonctionnalités étendues

Voir How to use actions pour plus de détails