2012-06-01 1 views
3

J'ai créé des champs de texte à partir desquels je veux utiliser l'entrée utilisateur. J'ai lu que je devrais utiliser un documentlistener, mais j'ai quelques difficultés à l'appliquer au bon endroit je pense.Comment implémenter documentlistener

Dans le code, j'essaie de l'implémenter dans le champ de texte tf1. L'entrée im devrait obtenir doit être analysée à un double afin que je puisse faire un calcul mathématique là-dessus.

Voici mon code où j'essaie de l'implémenter.

import java.awt.ComponentOrientation; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 


public class Display { 
final static boolean shouldFill = true; 
final static boolean shouldWeightX = true; 
final static boolean RIGHT_TO_LEFT = false; 

public static void addComponentsToPane(Container pane) { 

    if (RIGHT_TO_LEFT) { 
     pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
    } 
    JButton button; 
    JLabel label; 

    pane.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    if (shouldFill) { 
    //natural height, maximum width 
    c.fill = GridBagConstraints.HORIZONTAL; 
    } 
    if (shouldWeightX) { 
    c.weightx = 0.5; 
    } 

    ... 

    button = new JButton("Value Bet"); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.ipady = 0; 
    c.gridx = 0; 
    c.gridy = 1; 
    pane.add(button, c); 
    button.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) 
     { 
      //Execute when button is pressed 
      JFrame frame = new JFrame("Value Bet"); 
      frame.setVisible(true); 
      frame.setSize(500,300); 
      GridBagLayout layout = new GridBagLayout(); 
      frame.setLayout(layout); 
      GridBagConstraints c = new GridBagConstraints(); 

      JLabel label; 
      JTextField tf; 

      if (shouldFill) { 
      //natural height, maximum width 
      c.fill = GridBagConstraints.HORIZONTAL; 
      } 
      if (shouldWeightX) { 
      c.weightx = 0.5; 
      } 

      ... 

      final JTextField tf1 = new JTextField(); 
      c.fill = GridBagConstraints.HORIZONTAL; 
      c.gridx = 1; 
      c.gridy = 2; 
      frame.add(tf1, c); 

      tf1.getDocument().addDocumentListener(new DocHandler(){ 
       public class DocHandler implements DocumentListener{ 

        @Override 
        public void changedUpdate(DocumentEvent arg0) { 
         tfHasChanged(); 

        } 

        @Override 
        public void insertUpdate(DocumentEvent arg0) { 
         tfHasChanged(); 

        } 

        @Override 
        public void removeUpdate(DocumentEvent arg0) { 
         tfHasChanged(); 

        } 

       } 

       public void tfHasChanged(){ 
        double chance1 = Double.parseDouble(tf1.getText()); 
       } 
      });  

      ... div components 


} 

private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("Betting Application"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Set up the content pane. 
     addComponentsToPane(frame.getContentPane()); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

Je vous recommande de laisser tomber toute cette approche et d'utiliser une boîte de dialogue modale comme je l'ai recommandé dans [ma réponse] (http://stackoverflow.com/a/10846008/418556) à votre dernière question. Ou pour une meilleure aide, expliquez au moins pourquoi vous ne souhaitez pas adopter cette approche. –

+0

Pour une meilleure aide plus rapidement, postez un [SSCCE] (http://sscce.org/). –

Répondre

4

pour les numéros que vous avez à mettre en œuvre DocumentFilter ou directement utiliser JFormattedTextField avec le numéro formatter

alors les moyens possibles (des exécutions capitales) lignes de code

formatter.setMinimum(0.0); 
formatter.setMaximum(1000.00); 

et ajouter quelques formules pour textField1, par exemple textField1 est la valeur de textField2 par exemple

import java.awt.*; 
import java.awt.font.TextAttribute; 
import java.math.*; 
import java.text.*; 
import java.util.Map; 
import javax.swing.*; 
import javax.swing.JFormattedTextField.*; 
import javax.swing.event.*; 
import javax.swing.text.InternationalFormatter; 

public class DocumentListenerAdapter { 

    public static void main(String args[]) { 
     JFrame frame = new JFrame("AbstractTextField Test"); 
     final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01)); 
     textField1.setFormatterFactory(new AbstractFormatterFactory() { 

      @Override 
      public AbstractFormatter getFormatter(JFormattedTextField tf) { 
       NumberFormat format = DecimalFormat.getInstance(); 
       format.setMinimumFractionDigits(2); 
       format.setMaximumFractionDigits(2); 
       format.setRoundingMode(RoundingMode.HALF_UP); 
       InternationalFormatter formatter = new InternationalFormatter(format); 
       formatter.setAllowsInvalid(false); 
       formatter.setMinimum(0.0); 
       formatter.setMaximum(1000.00); 
       return formatter; 
      } 
     }); 
     final Map attributes = (new Font("Serif", Font.BOLD, 16)).getAttributes(); 
     attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); 
     final JFormattedTextField textField2 = new JFormattedTextField(new Float(10.01)); 
     textField2.setFormatterFactory(new AbstractFormatterFactory() { 

      @Override 
      public AbstractFormatter getFormatter(JFormattedTextField tf) { 
       NumberFormat format = DecimalFormat.getInstance(); 
       format.setMinimumFractionDigits(2); 
       format.setMaximumFractionDigits(2); 
       format.setRoundingMode(RoundingMode.HALF_UP); 
       InternationalFormatter formatter = new InternationalFormatter(format); 
       formatter.setAllowsInvalid(false); 
       //formatter.setMinimum(0.0); 
       //formatter.setMaximum(1000.00); 
       return formatter; 
      } 
     }); 
     textField2.getDocument().addDocumentListener(new DocumentListener() { 

      @Override 
      public void changedUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      @Override 
      public void insertUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      private void printIt(DocumentEvent documentEvent) { 
       DocumentEvent.EventType type = documentEvent.getType(); 
       double t1a1 = (((Number) textField2.getValue()).doubleValue()); 
       if (t1a1 > 1000) { 
        Runnable doRun = new Runnable() { 

         @Override 
         public void run() { 
          textField2.setFont(new Font(attributes)); 
          textField2.setForeground(Color.red); 
         } 
        }; 
        SwingUtilities.invokeLater(doRun); 
       } else { 
        Runnable doRun = new Runnable() { 

         @Override 
         public void run() { 
          textField2.setFont(new Font("Serif", Font.BOLD, 16)); 
          textField2.setForeground(Color.black); 
         } 
        }; 
        SwingUtilities.invokeLater(doRun); 
       } 
      } 
     }); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(textField1, BorderLayout.NORTH); 
     frame.add(textField2, BorderLayout.SOUTH); 
     frame.setVisible(true); 
     frame.pack(); 
    } 

    private DocumentListenerAdapter() { 
    } 
} 
+0

Étant donné '' "Valeur Bet" 'je continue à penser que le meilleur composant serait un' JSpinner' avec un 'NumberModel' - mais alors l'OP semble m'ignorer. :) –

+1

@Andrew Thompson sûr BNI, mon mauvais par défaut je ne vérifie jamais les demandeurs userprofiles, c'est de protéger ma santé mentale :-) – mKorbel

+0

Je ne vérifie généralement pas les profils, juste quand j'ai un sens irrésistible de Déjà vu (oh , et ne soyez pas excité, ces petits trucs drôles sont probablement corrects parce que j'ai copié/collé [Déjà vu de Wikipedia] (http://en.wikipedia.org/wiki/D%C3%A9j%C3%A0_vu);). –

1

si tf1 est un champ de texte puis faire, Document Listener implémente 3 méthodes comme changedUpdate, insertUpdate, removeUpdate

tf1.getDocument().addDocumentListener(new DocumentListener() { 

    @Override 
     public void changedUpdate(DocumentEvent e){ 

           //do some math 
           tf1.getText(); 
            } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 

            /do some math 
           tf1.getText(); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      // TODO Auto-generated method stub 

     } 
});