2017-02-17 1 views
-1

Ma méthode try and catch fonctionne et permet de savoir si la saisie de texte à JTextField est un nombre ou non. Quand il ne s'agit pas d'un nombre, le texte doit être supprimé et indiquer que ce n'est pas un nombre, mais jusqu'à présent, je n'ai pu supprimer que le texte écrit en utilisant une boucle for. Ce qui supprime tout le texte sur tous les JTextFields. Je n'ai besoin que de supprimer celui qui vient d'être écrit par l'utilisateur. Je n'ai pas réussi à trouver la bonne façon de faire ce que la boucle for fait d'une manière qui ne supprime le texte qu'une seule fois.Avez-vous essayé et attrapé un test pour déterminer si l'entrée de l'utilisateur n'est pas un nombre. Besoin d'aide pour écrire un JTextfield vide

C'est un jeu de Sudoku, il a comme 81 champs de texte

Vous pouvez trouver le test à la partie la plus décrite avec ce commentaire au-dessus:

// ------- -------------------------------------------------- ce test < Je veux juste enlever que l'on sentait l'utilisateur écrit dans

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.concurrent.ThreadLocalRandom; 

/** 
* Created by Gaute on 1/30/2017. 
*/ 

public class Assignment03GUI extends JFrame implements ActionListener{ 
    ArrayList<JTextField> txtfeltNummer = new ArrayList<JTextField>(); 
    JMenuBar menuBar = new JMenuBar(); 
    JMenu fileMenu = new JMenu("File"); 

    JMenu newGame = new JMenu("New Game"); 

    JMenuItem easy = new JMenuItem("Easy"); 
    JMenuItem medium = new JMenuItem("Medium"); 
    JMenuItem hard = new JMenuItem("Hard"); 

    JMenuItem deleteGame = new JMenuItem("Delete Game"); 

    public Assignment03GUI() { 
     JFrame sudokuWindow = new JFrame(); 
     sudokuWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     sudokuWindow.setTitle("Sudoku"); 

     sudokuWindow.setLayout(new GridLayout(9, 0)); 
     sudokuWindow.setSize(1000,1000); 

     menuBar.add(fileMenu); 
     fileMenu.add(newGame); 
     fileMenu.add(deleteGame); 

     newGame.add(easy); 
     newGame.add(medium); 
     newGame.add(hard); 

     sudokuWindow.setJMenuBar(menuBar); 

     JTextField tekstfelt;    //Deklarer variabelen så den kan brukes utenfor for løkka 

     for (int i = 0; i < 81; i++) { 
      tekstfelt = new JTextField(); 



      //---------------------------------------------------------This test < Just want to remove that one felt user wrote in 
      tekstfelt.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        String text = ((JTextField) e.getSource()).getText(); 

        try{ 
         Integer.parseInt(text); 
         System.out.println("An integer"); 
        } 
        catch (NumberFormatException e2) { 
         for (JTextField felt : txtfeltNummer) { 
          felt.setText(""); 
          felt.setEditable(true); 
         } 
         JOptionPane.showMessageDialog(null,"Ugyldig, ikke et tall"); 
        } 
       } 
      }); 



      tekstfelt.setSize(100,100); 

      tekstfelt.putClientProperty("id ", Integer.valueOf(i)); 

      txtfeltNummer.add(tekstfelt); 
      sudokuWindow.add(tekstfelt); 
     } 

     easy.addActionListener(this); 
     medium.addActionListener(this); 
     hard.addActionListener(this); 
     deleteGame.addActionListener(this); 

     sudokuWindow.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     Object source = e.getSource(); 

     if (source.equals(easy) || source.equals(medium) || source.equals(hard)) { 
      for (JTextField felt : txtfeltNummer) { 
       felt.setText(randomNumber(1, 9)); 
       felt.setEditable(true); 

       int removeNumbers = Integer.parseInt(randomNumber(0, 3)); 

       if (source.equals(easy) && removeNumbers == 0) { 
        felt.setText(""); 
       } 
       else if (source.equals(medium) && removeNumbers <= 1) { 
        felt.setText(""); 
       } 
       else if (source.equals(hard) && removeNumbers <= 2) { 
        felt.setText(""); 
       } 
       else { 
        felt.setEditable(false); 
       } 
      } 
     } 

     if (e.getSource().equals(deleteGame)) { 
      System.out.println("Delete Game"); 

      for (JTextField felt : txtfeltNummer){ 
       felt.setText(""); 
       felt.setEditable(true); 
      } 
     } 
    } 

    public static String randomNumber(int min, int max) { 
     int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1); 
     String randomNumString = Integer.toString(randomNum); 

     return randomNumString; 
    } 
} 
+0

Vous seriez probablement mieux d'utiliser un DocumentFilter: http://docs.oracle.com/javase/7/docs/api/javax/swing/text/DocumentFilter.html – ControlAltDel

+0

C'est quelque chose de nouveau pour moi – Zuflus

Répondre

0

a trouvé la réponse avec l'aide d'un autre site, tout ce que je devais faire était de changer

pour (JTextField senti: txtfeltNummer) à JTextField felt = (JTextField) e.getSource();

tekstfelt.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        String text = ((JTextField) e.getSource()).getText(); 

        try{ 
         Integer.parseInt(text); 
         System.out.println("An integer"); 
        } 
        catch (NumberFormatException e2) { 
         for (JTextField felt : txtfeltNummer) { 
          felt.setText(""); 
          felt.setEditable(true); 
         } 
         JOptionPane.showMessageDialog(null,"Ugyldig, ikke et tall"); 
        } 
       } 
      });