2016-01-11 1 views
1

J'ai JFrame avec 3 JPanel (essentiellement trois onglets). un des panneaux a une zone de texte. il y a une restriction de valeur sur la zone de texte. Cela signifie que l'utilisateur peut entrer seulement 1-1000 nombre dedans. S'il entre un nombre> 1000, il lance le message d'avertissement. Maintenant j'utilise focuslistener pour sauvegarder le numéro entré dès qu'il perd le focus. Mais si l'utilisateur entre 1200 et clique sur un autre onglet (panneau), il me donne un message d'avertissement attendu mais va aussi à l'autre onglet. Je dois rester dans le même panneau s'il y a une boîte d'avertissement. Je ne veux pas perdre le focus du panneau actuel.java restreindre la commutation de fenêtre/Jpanel

mMaxLabelLength = new JTextField(); 
mMaxLabelLength.addActionListener(this); 

public void focusGained(FocusEvent fe) 
{ 
    // do NOTHING 
} 

@Override 
public void focusLost(FocusEvent fe) 
{ 
    saveActions(); 
} 

public void actionPerformed(ActionEvent e) 
{ 
    //Do something 
} 

private void saveActions() 
{ 
    // error message 
    JOptionPane.showMessageDialog(this, 
     "Please enter an integer value between 1 and 1000.", 
     "Invalid Entry", JOptionPane.INFORMATION_MESSAGE); 
    SwiftApplication APP = SwiftApplication.getInstance(); 
    int nMaxLabel = APP.getMaxPieLabel(); 
    mMaxLabelLength.setText(new Integer(nMaxLabel).toString()); 
    mMaxLabelLength.requestFocus(); 
} 
+1

Envisagez d'utiliser 'JSpinner' avec un [' SpinnerNumberModel'] (https://docs.oracle.com/javase/8/docs/api/javax/swing/SpinnerNumberModel.html) à la place. –

Répondre

1

Le bloc de code dans la question n'offre pas trop de détails, mais pour autant que je le comprends, vous devez utiliser un VetoableChangeListener pour interdire le changement de mise au point .

Voici un exemple de Java2s:

import java.awt.Component; 
import java.awt.KeyboardFocusManager; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyVetoException; 
import java.beans.VetoableChangeListener; 

public class Main { 
    public static void main(String[] argv) { 
    KeyboardFocusManager.getCurrentKeyboardFocusManager().addVetoableChangeListener(
     new FocusVetoableChangeListener()); 
    } 
} 

class FocusVetoableChangeListener implements VetoableChangeListener { 
    public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { 
    Component oldComp = (Component) evt.getOldValue(); 
    Component newComp = (Component) evt.getNewValue(); 

    if ("focusOwner".equals(evt.getPropertyName())) { 
     if (oldComp == null) { 
     System.out.println(newComp.getName()); 
     } else { 
     System.out.println(oldComp.getName()); 
     } 
    } else if ("focusedWindow".equals(evt.getPropertyName())) { 
     if (oldComp == null) { 
     System.out.println(newComp.getName()); 
     } else { 
     System.out.println(oldComp.getName()); 
     } 
    } 

    boolean vetoFocusChange = false; 
    if (vetoFocusChange) { 
     throw new PropertyVetoException("message", evt); 
    } 
    } 
} 

Mais, plus j'y pense, peut-être utilise InputVerifier et public boolean shouldYieldFocus(JComponent input) est plus approprié. Voir "Validation des entrées" dans le tutoriel Java.

+1

Eh bien, @isi était plus rapide :-) – t0r0X

+0

Habituellement, cela m'arrive. –

1

On dirait que vous êtes à la recherche d'un InputVerifier.

Classe abstraite permettant la validation d'entrée via le mécanisme de mise au point. Lorsqu'on tente de décaler le focus d'un composant contenant un vérificateur d'entrée, le focus n'est pas abandonné tant que le vérificateur n'est pas satisfait.

Comme le oracle page décrit, il peut être utilisé pour écrire propres, qui rejettent les vérificateurs entrées invalides et garde l'attention quant à lui sur la JComponent associée.

Par conséquent, vous avez juste besoin de faire deux choses:

  1. Écrivez votre propre InputVerifier, par exemple MyVerifier ou utilisez l'un de ceux déjà existants et créez une instance de celui-ci. (Voir ci-dessous pour un petit exemple complet vérifiable)
  2. Enregistrez votre instance de vérificateur sur la cible JComponent en utilisant les appels au Input Verification API.

Cela signifie, pour enregistrer un ...

InputVerifier appel à la méthode setInputVerifier de la classe JComponent. Par exemple, le InputVerificationDemo a le code suivant:

private MyVerifier verifier = new MyVerifier(); 
... 
amountField.setInputVerifier(verifier); 

Remarque Pour une raison quelconque, je ne peux pas trouver une source pour le java8 InputVerifier, il semble dès maintenant que le lien est rompu.

Petit Vérifiable Exemple complet (de here)

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

// This program demonstrates the use of the Swing InputVerifier class. 
// It creates two text fields; the first of the text fields expects the 
// string "pass" as input, and will allow focus to advance out of it 
// only after that string is typed in by the user. 

public class VerifierTest extends JFrame { 
    public VerifierTest() { 
     JTextField tf1 = new JTextField ("Type \"pass\" here"); 
     getContentPane().add (tf1, BorderLayout.NORTH); 
     tf1.setInputVerifier(new PassVerifier()); 

     JTextField tf2 = new JTextField ("TextField2"); 
     getContentPane().add (tf2, BorderLayout.SOUTH); 

     WindowListener l = new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }; 
     addWindowListener(l); 
    } 

    class PassVerifier extends InputVerifier { 
     public boolean verify(JComponent input) { 
      JTextField tf = (JTextField) input; 
      return "pass".equals(tf.getText()); 
     } 
    } 

    public static void main(String[] args) { 
     Frame f = new VerifierTest(); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 
+0

Comment utiliser InputVerifier avec addFocusListener. J'ai essayé "mMaxLabelLength.addFocusListener (this); \t \t mMaxLabelLength.setInputVerifier (nouveau PassVerifier()); ", mais cela n'a pas aidé – user1631306

+0

La combinaison des deux peut surgir des conflits, voir [cette réponse] (http://stackoverflow.com/a/26433840/3165552) qui combine les deux. Une addition importante est la méthode 'shouldYieldFocus' dans la sous-classe' MyInputVerifier'. Cependant, les deux instances utilisent l'approche de focus ou de vérification. Je suppose que l'ordre d'installation des auditeurs peut également avoir un effet, mais je ne suis pas très sûr de cela. –

+0

Je comprends que cela me permettrait de restreindre la saisie ou la sélection de quelque chose dans le même panneau, mais j'ai plusieurs panneaux dans un JFrame comme onglet. et ça ne m'empêcherait pas de sélectionner un autre onglet (même si la valeur est fausse) – user1631306