2017-03-06 1 views
0

Je rencontre des problèmes avec un projet Java. J'ai créé une interface graphique vide, et maintenant je dois y ajouter quelques fonctionnalités. Je suis coincé, cependant, sur la façon de s'y prendre. La disposition de base a 4 boutons radio, Rectangle, Box, Circle et Cylinder. J'ai un panneau de groupe qui a 4 panneaux distincts qui ont chacun des zones de texte avec des étiquettes pour entrer la hauteur, la longueur, la largeur et le rayon. Voici à quoi cela ressemble: GUI layout. Selon le bouton radio sélectionné, certaines cases inutiles doivent être masquées. Par exemple, si Rectangle est sélectionné, seules les zones de longueur et de largeur doivent être visibles.Gestionnaires d'événements de boutons radio

Le cadre principal qui affichera tout est ici:

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import javax.swing.JButton; 
import java.awt.Font; 

public class GUIFrame extends JFrame 
{ 
    //private final BorderLayout layout; 
    private final FlowLayout layout; 
    private final JLabel lblTitle; 
    private final JButton btnProc; 

    public GUIFrame() 
    { 

     super("GUI Layout"); 
     Font titleFont = new Font("Verdana", Font.BOLD, 26); 

     btnProc = new JButton("Click to Process"); 
     lblTitle = new JLabel("Figure Center"); 
     lblTitle.setFont(titleFont); 
     widthPanel myWidth = new widthPanel(); 
     myWidth.setLocation(0, 400); 
     lengthPanel myLength = new lengthPanel(); 
     heightPanel myHeight = new heightPanel(); 
     radiusPanel myRadius = new radiusPanel(); 
     radioButtonPanel myButtons = new radioButtonPanel(); 

     //layout = new BorderLayout(3, 2); 
     layout = new FlowLayout(); 

     JPanel txtGroup = new JPanel(); 
     txtGroup.setLayout(new GridLayout(2, 2)); 
     txtGroup.add(myWidth); 
     txtGroup.add(myLength); 
     txtGroup.add(myRadius); 
     txtGroup.add(myHeight); 
     setLayout(layout); 

     add(lblTitle); 
     add(myButtons); 
     add(txtGroup); 
     add(btnProc); 


     if(myButtons.btnRectangle.isSelected()) 
     { 
      myHeight.setVisible(false); 
      myRadius.setVisible(false); 
     } 

    } 

    private class RadioButtonHandler implements ItemListener 
    { 
     @Override 
     public void itemStateChanged(ItemEvent event) 
     { 

     } 
    } 

} 

Je peux obtenir ce travail à l'aide si les déclarations, mais je suis censé être gestionnaires d'événements et je suis perdu sur la façon de code qui pour le faire fonctionner correctement.

si elle aide, voici le code pour le panneau de bouton:

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.ButtonGroup; 
import javax.swing.JLabel; 
import java.awt.GridLayout; 
import java.awt.event.ItemListener; 
import java.awt.event.ItemEvent; 


public class radioButtonPanel extends JPanel 
{ 
    private final JRadioButton btnRectangle; 
    private final JRadioButton btnBox; 
    private final JRadioButton btnCircle; 
    private final JRadioButton btnCylinder; 
    private final ButtonGroup radioButtonGroup; 
    private final JLabel label; 
    private final JPanel radioPanel; 


    public radioButtonPanel() 
    { 
     radioPanel = new JPanel(); 
     radioPanel.setLayout(new GridLayout(5,1)); 

     btnRectangle = new JRadioButton("Rectangle", true); 
     btnBox = new JRadioButton("Box", false); 
     btnCircle = new JRadioButton("Circle", false); 
     btnCylinder = new JRadioButton("Cylinder", false); 
     label = new JLabel("Select A Figure:"); 
     radioPanel.add(label); 
     radioPanel.add(btnRectangle); 
     radioPanel.add(btnBox); 
     radioPanel.add(btnCircle); 
     radioPanel.add(btnCylinder); 

     radioButtonGroup = new ButtonGroup(); 
     radioButtonGroup.add(btnRectangle); 
     radioButtonGroup.add(btnBox); 
     radioButtonGroup.add(btnCircle); 
     radioButtonGroup.add(btnCylinder); 


     add(radioPanel); 


    } 

} 

Et un échantillon de l'un des panneaux. Ils suivent tous la même configuration, juste des noms de variables différents.

import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JPanel; 
import java.awt.GridLayout; 

public class heightPanel extends JPanel 
{ 
    private final JLabel lblHeight; 
    private final JTextField txtHeight; 
    private final JPanel myHeight; 

    public heightPanel() 
    { 
     myHeight = new JPanel(); 
     myHeight.setLayout(new GridLayout(2,1)); 

     lblHeight = new JLabel("Enter Height:"); 
     txtHeight = new JTextField(10); 
     myHeight.add(lblHeight); 
     myHeight.add(txtHeight); 


     add(myHeight); 
    } 
} 
+0

Vous avez tort donné 'radioButtonPanel' à la place de la classe principale du cadre, pouvez-vous résoudre ce problème? –

+0

Je ne savais pas que je l'ai fait. Je l'ai réparé. – Wildfire44601

Répondre

0

Le code ci-dessous devrait vous donner une introduction rapide de la façon d'utiliser l'événement listener/handler pour votre groupe de boutons (JRadioButtons).

mais je suis censé utiliser des gestionnaires d'événements et je suis perdu sur comment code pour le faire fonctionner correctement.

//add listener to the rectangle button and should be the same for the other `JRadioButtons` but with different `identifiers`. 

    btnRectangle.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if(e.getSource() == btnRectangle){ 
      //TODO 
      } 
     } 
    }); 

En fonction du bouton radio est sélectionné, certaines boîtes qui ne sont pas nécessaires devraient être cachés. Par exemple, si Rectangle est sélectionné, seules les zones de longueur et de largeur doivent être visibles. méthode

// Pour masquer JTextFields utilisation void setVisible(boolean visible). Vous devez passer false comme argument de la méthode si vous souhaitez masquer le JTextField.

Exemple:

btnRectangle.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if(e.getSource() == btnRectangle){ 
       TextFieldName.setVisible(false); // set the textfields that you want to be hidden once the Rectangle button is chosen. 
      } 
     } 
}); 
+0

Je pense que je suis ceci, mais laissez-moi m'assurer. Dans l'instruction if, e.getSource() détecte quel bouton radio est sélectionné et appelle la propriété setVisible pour les champs que je veux false pour les masquer. Maintenant, est-ce que actionPerformed est une fonction générique qui intercepte un changement, ou devrais-je le remplacer par quelque chose de plus spécifique comme itemStateChanged? – Wildfire44601

+0

Dois-je créer un ActionListener pour chaque bouton, ou puis-je en créer un avec une série d'instructions if pour gérer les différents boutons? De la façon dont votre échantillon ressemble, je suppose que chaque bouton a son propre ActionListener? – Wildfire44601

+0

Oui chacun avec son propre, jetez un oeil à la page de référence Oracle Java pour plus d'aide. Aussi, si la réponse vous a aidé, j'apprécierais vraiment que vous marquiez la réponse comme acceptée. Merci. –