2017-03-05 6 views
0

Ce que je veux atteindre est très simple. J'ai 2 classes. "SpeedingTicket" & "SpeedingTicket GUI". Dans mon GUI j'ai 1 nom de zone de texte txtSpeedLimit & un bouton. Dans ma classe SpeedingTicket, j'ai une variable "int speedingTicket". J'ai aussi l'intérieur de ma classe SpeedingTicket une méthode set obtenir & pour « speedingTicket ».Java - Lier une variable JTextField avec une autre variable de classe

Je sais comment obtenir un texte défini à l'aide JTextFields, mais je veux être en mesure de:

reçoivent l'entrée de la « txtSpeedLimit », et stocker cette valeur dans la variable d'instance « txtSpeedLimit » dans la Classe "SpeedTicket" Je peux alors vérifier la validation, etc., quand je viens d'ajouter la vitesse du véhicule.

Peut-être que ce n'est pas la façon la plus efficace de gérer ce programme. Peut-être que je devrais supprimer les variables d'instance dans SpeedingTicket, et traiter tout cela dans l'interface graphique.

Tout conseil serait grandement apprécié.

En fait ce que je suis en train de faire est la suivante:

class confirmHandler implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     String val = txtSpeedLimit.getText(); 
     int realNum = speed.getSpeedLimit() = txtSpeedLimit; < but obviously that doesn't work, but I want the textbox link to the variable. 

EDIT: Si nous enlevons l'interface graphique, tout ce que je veux que mon programme à faire est la suivante: Limite de vitesse: 50 < tapée par textfield vitesse: 60 < pénétrait par textfield si la vitesse est bla bla (ive déjà codé cela) .. puis la sortie d'un résultat à l'un de mes étiquettes. Je accompli cela sans faire une interface graphique et la rendre console uniquement sur la base, mais au lieu de l'utilisateur en tapant via la console, je veux qu'il soit tapé par textfields. Les valeurs saisies dans les zones de texte doivent être stockées dans les deux variables (vitesse et limitation de vitesse) de la classe SpeedingTicket.

+0

Vous pouvez vérifier les changements de texte comme ici: http://stackoverflow.com/questions/3953208/value-change -listener-to-jtextfield et créer un écouteur costume "SpeedChangeListener" –

+0

Vous voulez savoir comment utiliser les modèles pour les composants swing ui. – GhostCat

+0

Copie possible de [* Comment câbler un volet à un autre *] (http://stackoverflow.com/q/10523343/230513). – trashgod

Répondre

0

Vous pouvez mettre à jour une valeur:

public class SpeedingTicket { 

    int speedingTicket; 

    public SpeedingTicket() { 

     speedingTicket = 500; 
    } 

    public int getSpeedingTicket() { 
     return speedingTicket; 
    } 
} 

par:

public class SpeedingTicketGUI extends JPanel{ 

    SpeedingTicket st; 

    SpeedingTicketGUI() { 

     st = new SpeedingTicket(); 
     setLayout(new FlowLayout(FlowLayout.LEFT)); 
     JTextField txtField = new JTextField(10); 
     txtField.setText(""+st.getSpeedingTicket()); 
     add(txtField); 

     JButton btn = new JButton("Update"); 
     btn.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       setSpeedingTicket(txtField.getText()); 
      } 
     }); 
     add(btn); 
    } 

    private void setSpeedingTicket(String text) { 

     try { 
      int speedTicket = Integer.parseInt(text); 
      st.setSpeedingTicket(speedTicket); 
      System.out.println("Speeding ticket set to " +st.getSpeedingTicket()); 
     } catch (NumberFormatException ex) { 
      System.out.println("Invalid value " +text); 
      ex.printStackTrace(); 
     } 
    } 

    public static void main(String[] args){ 

     JFrame frame = new JFrame("Speeding Ticket"); 
     frame.setSize(400,100); 
     frame.add(new SpeedingTicketGUI()); 
     frame.setVisible(true); 
    } 
} 
+0

Bon alors aurais-je juste besoin d'un écouteur de document qui renvoie à la classe SpeedingTicket d'origine lorsque j'entre une valeur dans la zone de texte des classes d'interface graphique? – TLG123

+0

Non. Si vous voulez que le 'SpeedingTicketGUI' change la valeur de' speedingTicket' dans 'SpeedingTicket' (disons en appuyant sur un bouton), vous aurez besoin d'un écouteur dans' SpeedingTicketGUI', comme vous l'avez fait. S'il vous plaît modifier la question pour clarifier ce que vous essayez d'atteindre exactement. – c0der

+0

Hmm à droite .. Je l'ai également édité. – TLG123

0

Vous n'avez pas besoin de stocker des valeurs dans JText ou des composants de l'interface graphique ... Utilisez des variables statiques globales. Par exemple:

public static int speed_limit;

Vous pouvez accéder à cette variable de toute méthode, classe, etc.

+0

Les variables statiques ne doivent être utilisées que si elles sont vraiment nécessaires. Dans ce cas, un modèle d'écoute serait plus utile –

0

Il y a plusieurs façons de le faire.

Vous pouvez détecter les modifications de champ de texte en utilisant un DocumentListener ou si vous le souhaitez (non recommandé) par un KeyListener.

Le Listener pourrait être mis en œuvre directement par votre classe ou votre IUG autre classe.Si vous voulez plus d'abstraction, vous pouvez mettre en œuvre la DocumentListener par votre classe IUG et créer une méthode

public void addSpeedChangeListener(SpeedChangeListener scl) { 

    this.speedChangeListeners.add(scl); 
} 

Votre SpeedChangeListener pourrait être très simple:

public interface SpeedChangeListener { 

    public void speedChanged(int value); 
} 

Ensuite, votre seconde classe implémente l'SpeedChangeListener et appelle addSpeedChangeListener(this) sur votre classe gui. Dans la classe gui, votre programme d'écoute de documents appelle speedChanged(val) pour chaque programme d'écoute enregistré.

EDIT Vous pouvez également utiliser le bouton et appeler le speedChanged sur chaque auditeur dans la méthode actionPerformed du ActionListener.

0

Je pense qu'il serait plus facile d'utiliser un JOptionDialog qui pop-ups lorsque le bouton est cliqué. De cette façon, vous pouvez facilement obtenir des entrées et également valider l'entrée tout de suite.