Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält

MagicFlo

Mitglied
In der Methode "IsNumeric" mag er die erste Zeihle im try-Block nicht, da im JTextField immer ein Object bzw. String übergeben wird. Ich dachte eigentlich wenn ich den übergebenden String nur Zahlen rein schreibe sollte er nicht in den catch-Block springen. Dem ist aber nicht so!
Weiß jemand wie ich ganz simpel in meiner "IsNumeric"-Methode überprüfen kann ob die übergebene "value" nur Zahlen enthälten? Wenn ein String (Buchstaben) übergeben wurde dann soll er in den catch-Block springen.

Java:
@SuppressWarnings("serial")
public class ToDoList extends JFrame{
    private final JTextField entryInput;
    private final DefaultListModel<Object> listEntry;
    private static boolean isInt;

    public ToDoList() {
       entryInput = new JTextField();
       listEntry = new DefaultListModel<>();

       add.addActionListener(e -> isNumeric(entryInput.getText()));

    private static boolean isNumeric(Object value) {
       try {
           Integer.parseInt(value);
           return isInt = true;
       }
       catch (NumberFormatException e){
           return isInt = false;
       }
//       if ( value instanceof Integer) {
//           return isInt = true;
//       }
//       else {
//           System.out.println("Im 2. Inputfeld wurde kein Integer eingetragen");
//           return isInt = false;
//       }
   }
    private void add() {
       String intInput = entryInput.getText();
       if (isInt) {
           listEntry.addElement(intInput);
           //System.out.println(intInput);
           entryInput.setText("");
           entryInput.requestFocus();
       }
       else {
           return;
       }

   }
 
Indem ich meinen Code geschrieben habe und er immer in den catch Block springt. Egal was für ein Wert ich dem value übergebe. Glaub mir.. ich wundere mich genau so. Deswegen hab ich mich ans Internet gewedet.
 
entryInput.getText() gibt einen String zurück.
Warum erwartest du dann ein Object in der isNumeric Methode.
Integer.parseInt(value); erwartet einen String. Also entweder value.toString() oder isNumeric(Object value) in isNumeric(String value) ändern.
 
Indem ich meinen Code geschrieben habe und er immer in den catch Block springt. Egal was für ein Wert ich dem value übergebe. Glaub mir.. ich wurde mich genau so.
Der Code wird nicht einmal kompiliert, wie soll er dann in den catch-Block springen? Wie @max40 schon geschrieben hat, hat Integer keine Methode parseInt mit der passenden Signatur (Object).
 
Da habt ihr recht. Das habe ich falsch hier geschrieben. Also in meinem Code ist es ein String, das übergeben wird. Aber das ändert leider nichts an der Tatsache dass er trotzdem immer in den Catch-Block springt. Ich hoffe ich stell mich nicht einfach nur dumm an aber ich bekomm nicht raus warum.
 
In der Methode "IsNumeric" mag er die erste Zeihle im try-Block nicht, da im JTextField immer ein Object bzw. String übergeben wird.
Ist ja auch klar, es gibt kein Integer:😛arseInt(Object). Übergib der Methode einen String. du solltest auch DefaultListModel<String> entsprechend verwenden.
Java:
private boolean isInt;
// ...

add.addActionListener(e -> isInt = isNumeric(entryInput.getText()));

    private static boolean isNumeric(Object value) {
       try {
           Integer.parseInt(value);
           return true;
       }
       catch (NumberFormatException e){
           return  false;
}


Das isInt Feld sollte auch auf keinen Fall static sein.

Es ist auch ein unschöner Programmierstil eine Exception für sowas zu missbrauchen. Besser wären Ansätze wie z.B. mit Regex oder Character::isDigit(char)

Java:
else {
           return;
       }
Total überflüssiger Code.

Außerdem rufst du die Add-Methode noch garnicht auf, ich hätte vermutet, dass beim ActionEvent add aufgerufen werden müsste

Dein Catch Block kann auch erreicht werden, wenn die eingegebene Zahl > Integer.MAX_VALUE ist. Auch aus diesem Grund wäre eine andere vorgehensweise für isNumeric zu empfehlen.
 
Zuletzt bearbeitet:
Ok so wies aussieht habe ich euch und mich nur damit verwirrt indem ich nur einen Teil des Codes rein geschickt habe. Ich dachte es wäre so Übersichtlicher. Zu deiner Frage @max40 ich übergeben ihr ein ganz normalen Integer (wie z.B.: 2131). Ich schicke euch mal meinen ganzen Code:
Der Code ist nicht schön, da ich in diesem Thema noch sehr neu bin aber ich hoffe wenigstens ihr werdet schlau draus.

Java:
package ToDo;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JViewport;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.Border;
import javax.swing.plaf.TextUI;

/**
* Source Code für AP Aufgabe vom 12/10/2018
* ToDo Liste
* @author fschwarz
*/
@SuppressWarnings("serial")
public class ToDoListEntry extends JFrame{
   
    public static void main(String[] args) {
        new ToDoListEntry();
    }
   
    private final JTextField input;
    private final JTextField entryInput;
    private final DefaultListModel<String> listModel;
    private final DefaultListModel<String> listEntry; // String => Integer to complete my Code
    private final JList<String> listM;
    private final JList<String> listE; // String => Integer to complete my Code
    private static boolean isInt;
   

    public ToDoListEntry() {
        /**
         * Konstruktor setzt den Titel von dem JFrame automatisch mit also anstatt:
         * <code>
         * super();
         *
         * setTitle("Title");
         * </code>
         */
        super("ToDo List");
       
        /**
         * Container der JFrame:
         * hier werden später alle anderen komonenten hinzugefügt
         */
        final Container container = getContentPane();
        container.setLayout(new BorderLayout());
       
        /**
         * Alle UI komponenten iniziallisiert
         */
        input = new JTextField();
        entryInput = new JTextField();
        listModel = new DefaultListModel<>();
        listEntry = new DefaultListModel<>();
        listM = new JList<>(listModel);
        listE = new JList<>(listEntry);
       
        // Die JScrollPane nimmt eine Componente als parameter, dieser wird dann innerhalb dargestellt: JList

        final JButton add = new JButton("add");
        final JButton remove = new JButton("remove");
        final JButton removeAll = new JButton("remove all");
        final JButton exit = new JButton("exit");
       
        // Dieses JPanel wird die Buttons halten
        final JPanel buttons = new JPanel();
       
        // Dieses JPanel wird das ScrollPanel behandeln
        JPanel scroll = new JPanel();
        final JScrollPane scrollPane = new JScrollPane(scroll);
        scroll.add(listM);
        scroll.add(listE);
       
        // Designs the ScrollPane
        scroll.setBackground(Color.WHITE);
        DefaultListCellRenderer rendererModel = (DefaultListCellRenderer) listM.getCellRenderer();
        rendererModel.setHorizontalAlignment(JLabel.LEFT);   
        DefaultListCellRenderer rendererEntry = (DefaultListCellRenderer) listE.getCellRenderer();
        rendererEntry.setHorizontalAlignment(JLabel.RIGHT);
       
        // Diese JPanel wird die Input Felder halten
        final JPanel inputs = new JPanel();
       
        // Inputs dem JPanel hinzufügen
        inputs.add(input);
        inputs.add(entryInput);
       
        // GridLayout für die Inputs
        inputs.setLayout(new GridLayout(0, 2));
       
        // GridLayout für die Buttons, damit alle gleich groß sind
        buttons.setLayout(new GridLayout(0, 1));
       
        // Buttons dem JPanel hinzufügen
        buttons.add(add);
        buttons.add(remove);
        buttons.add(removeAll);
        buttons.add(exit);
       
        // Die Buttons rechts am Container hinzufügen
        container.add(buttons, BorderLayout.EAST);
       
        // Das Input Feld oben am Container hinzufügen
        container.add(inputs, BorderLayout.NORTH);
       
        // Die Liste mittig am Container hinzufügen
        container.add(scrollPane, BorderLayout.CENTER);
       
        // Windows Adapter hinzufügen, um Application richtig zu beenden wenn x gedruckt wird
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                exit();
            }
        });
       
        // Einen KeyListener zum JTextField hinzufügen um Key Press abzufragen
        input.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    add();
                }
            }
           
        });
        entryInput.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    add();
                }
            }
           
        });
       
        add.addActionListener(e -> isNumeric(entryInput.getText()));
       
        // Wenn der "add" Butten gedrückt wurde, füge Text dem ListModel hinzu
        add.addActionListener(e -> add());
       
       
        // Wenn der "remove" Button gedrückt wurde, entferne alle selektierten Elemente
        remove.addActionListener(e -> remove());
       
        // Wenn der "remove all" Button gedrückt wurde, entferne alle Elemente des ListModels
        removeAll.addActionListener(e -> listModel.removeAllElements());
        removeAll.addActionListener(e -> listEntry.removeAllElements());
       
        // Wenn der "exit" Button gedrückt wurde, beende die Application
        exit.addActionListener(e -> exit());
       
        /**
         * Setzt die größe des JFrame in Pixel
         * Vorsicht: Container ist kleiner als die defeinierten Dimensionen
         * Da hier padding mit einberechnet ist
         */
        setSize(400, 250);
       
        /**
         * Setzt JFrame in das Center des primären Bildschirms
         */
        setLocationRelativeTo(null);
       
        /**
         * Macht das JFrame sichtbar
         */
        setVisible(true);
    }
   
    /**
     * Beendet die Application
     */
    private void exit() {
        System.exit(0);
    }
   

   
   
   
    private static boolean isNumeric(String value) {
        try {
            System.out.println(value);
            Integer.parseInt(value);
            return isInt = true;
        }
        catch (NumberFormatException e){
            return isInt = false;
        }
//        if ( value instanceof Integer) {
//            return isInt = true;
//        }
//        else {
//            System.out.println("Im 2. Inputfeld wurde kein Integer eingetragen");
//            return isInt = false;
//        }
    }
   
    /**
     * fügt den Text des JTextFields zum ListModel hinzu
     */
    private void add() {
        //Stellt sicher dass der Input nicht null oder empty ist
        listModel.addElement(input.getText());
       
        // Setzt das JTextField auf einen leeren wert
        input.setText("");
       
        // Setzt den Cursor im JTextField (optional)
        input.requestFocus();
       
        String intInput = entryInput.getText();
        if (isInt) {
            listEntry.addElement(intInput);
            System.out.println(intInput);
            entryInput.setText("");
            entryInput.requestFocus();
        }
        else {
            return;
        }

    }
   
    /**
     * Entfernt eins oder mehrere selektierte Elemente
     */
    private void remove() {
        // Speichert alle selektierten Elemente Index in einem Array
        int[] selectedValuesM = listM.getSelectedIndices();
        int[] selectedValuesE = listE.getSelectedIndices();
       
        // Wenn kein Element selektiert ist, mach nichts!
        if (selectedValuesM.length < 1 || selectedValuesE.length < 1) {
            return;
        }
        else {
            // Enternt die Elemente aus dem ListModel
            listModel.remove(selectedValuesM[0]);
            listEntry.remove(selectedValuesE[0]);
           
            // Wiederhole remove() für die restlichen Elemente
            remove();
        }
    }
}
 
das
Java:
        add.addActionListener(e -> isNumeric(entryInput.getText()));
    
        // Wenn der "add" Butten gedrückt wurde, füge Text dem ListModel hinzu
        add.addActionListener(e -> add());
ändern in
Java:
add.addActionListener(e -> machwas());

und sowas
Java:
    private void machwas() {
        isNumeric(entryInput.getText());
        add();
    }
hinzufügen, dann sollte es gehen.

ggf. noch ein if ume das isNumeric... aber du weist ja am besten was wie wo wann gemacht werden soll
 
Ähm:
Java:
        add.addActionListener(e -> isNumeric(entryInput.getText()));

        // Wenn der "add" Butten gedrückt wurde, füge Text dem ListModel hinzu
        add.addActionListener(e -> add());
Das funktioniert so - wenn überhaupt - nur zufällig, weil die Reihenfolge der Event-Benachrichtigungen nicht definiert ist.

Du hast eine Aktion "Hinzufügen" und die muss machen, was sie tun soll.

Abgesehen davon, wird der catch-Block freilich durchlaufen, wenn Du keine Zahl eingibst...
 
Ahhh perfekt. @max40 dein Lösungsvorschlag funktioniert, auch wenn ich nicht genau checke warum auf einmal. Aber das werde ich hoffentlich schon noch. Vielen Dank für eure schnelle Hilfe! Ohne euch würde ich sicher noch den ganzen Tag an dem Problem sitzen.

P.S.: Ich hoffe ich hab mich nicht zu dumm angestellt 😉 Wie gesagt ich lerne das alles noch.
 
Insgesamt ist der Code für einen Anfänger gar nicht so schlecht. Ich habe mal ein wenig rumgeschraubt und die entsprechenden Stellen kommentiert.

Java:
package ToDo;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JViewport;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.Border;
import javax.swing.plaf.TextUI;

/**
* Source Code für AP Aufgabe vom 12/10/2018
* ToDo Liste
* @author fschwarz
*/
@SuppressWarnings("serial")
public class ToDoListEntry extends JFrame{
  
    public static void main(String[] args) {
        new ToDoListEntry();
    }
  
    private final JTextField input;
    private final JTextField entryInput;
    private final DefaultListModel<String> listModel;
    private final DefaultListModel<String> listEntry; // String => Integer to complete my Code
    private final JList<String> listM;
    private final JList<String> listE; // String => Integer to complete my Code
    // REMOVED
  

    public ToDoListEntry() {
        /**
         * Konstruktor setzt den Titel von dem JFrame automatisch mit also anstatt:
         * <code>
         * super();
         *
         * setTitle("Title");
         * </code>
         */
        super("ToDo List");
      
        /**
         * Container der JFrame:
         * hier werden später alle anderen komonenten hinzugefügt
         */
        final Container container = getContentPane();
        container.setLayout(new BorderLayout());
      
        /**
         * Alle UI komponenten iniziallisiert
         */
        input = new JTextField();
        entryInput = new JTextField();
        listModel = new DefaultListModel<>();
        listEntry = new DefaultListModel<>();
        listM = new JList<>(listModel);
        listE = new JList<>(listEntry);
      
        // Die JScrollPane nimmt eine Componente als parameter, dieser wird dann innerhalb dargestellt: JList

        final JButton add = new JButton("add");
        final JButton remove = new JButton("remove");
        final JButton removeAll = new JButton("remove all");
        final JButton exit = new JButton("exit");
      
        // Dieses JPanel wird die Buttons halten
        final JPanel buttons = new JPanel();
      
        // Dieses JPanel wird das ScrollPanel behandeln
        JPanel scroll = new JPanel();
        final JScrollPane scrollPane = new JScrollPane(scroll);
        scroll.add(listM);
        scroll.add(listE);
      
        // Designs the ScrollPane
        scroll.setBackground(Color.WHITE);
        DefaultListCellRenderer rendererModel = (DefaultListCellRenderer) listM.getCellRenderer();
        rendererModel.setHorizontalAlignment(JLabel.LEFT);  
        DefaultListCellRenderer rendererEntry = (DefaultListCellRenderer) listE.getCellRenderer();
        rendererEntry.setHorizontalAlignment(JLabel.RIGHT);
      
        // Diese JPanel wird die Input Felder halten
        final JPanel inputs = new JPanel();
      
        // Inputs dem JPanel hinzufügen
        inputs.add(input);
        inputs.add(entryInput);
      
        // GridLayout für die Inputs
        inputs.setLayout(new GridLayout(0, 2));
      
        // GridLayout für die Buttons, damit alle gleich groß sind
        buttons.setLayout(new GridLayout(0, 1));
      
        // Buttons dem JPanel hinzufügen
        buttons.add(add);
        buttons.add(remove);
        buttons.add(removeAll);
        buttons.add(exit);
      
        // Die Buttons rechts am Container hinzufügen
        container.add(buttons, BorderLayout.EAST);
      
        // Das Input Feld oben am Container hinzufügen
        container.add(inputs, BorderLayout.NORTH);
      
        // Die Liste mittig am Container hinzufügen
        container.add(scrollPane, BorderLayout.CENTER);
      
        // Windows Adapter hinzufügen, um Application richtig zu beenden wenn x gedruckt wird
        setDefaultCloseOperation(EXIT_ON_CLOSE); // CHANGED
      
        // Einen KeyListener zum JTextField hinzufügen um Key Press abzufragen
        input.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    add();
                }
            }
          
        });
        entryInput.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    add();
                }
            }
          
        });
      
        // REMOVED
      
        // Wenn der "add" Butten gedrückt wurde, füge Text dem ListModel hinzu
        add.addActionListener(e -> add());
      
      
        // Wenn der "remove" Button gedrückt wurde, entferne alle selektierten Elemente
        remove.addActionListener(e -> remove());
      
        // Wenn der "remove all" Button gedrückt wurde, entferne alle Elemente des ListModels
        removeAll.addActionListener(e -> listModel.removeAllElements());
        removeAll.addActionListener(e -> listEntry.removeAllElements());
      
        // Wenn der "exit" Button gedrückt wurde, beende die Application
        exit.addActionListener(e -> exit());
      
        /**
         * Setzt die größe des JFrame in Pixel
         * Vorsicht: Container ist kleiner als die defeinierten Dimensionen
         * Da hier padding mit einberechnet ist
         */
        setSize(400, 250);
      
        /**
         * Setzt JFrame in das Center des primären Bildschirms
         */
        setLocationRelativeTo(null);
      
        /**
         * Macht das JFrame sichtbar
         */
        setVisible(true);
    }
  
    // REMOVED

    private static boolean isNumeric(String value) {
        return value.matches("[0-9]+"); // CHANGED
    }
  
    /**
     * fügt den Text des JTextFields zum ListModel hinzu
     */
    private void add() {
        //Stellt sicher dass der Input nicht null oder empty ist
        listModel.addElement(input.getText());
      
        // Setzt das JTextField auf einen leeren wert
        input.setText("");
      
        // Setzt den Cursor im JTextField (optional)
        input.requestFocus();
      
        String intInput = entryInput.getText();
        if (isNumeric(intInput)) { // CHANGED
            listEntry.addElement(intInput);
            System.out.println(intInput);
            entryInput.setText("");
            entryInput.requestFocus();
        }
        // REMOVED
    }
  
    /**
     * Entfernt eins oder mehrere selektierte Elemente
     */
    private void remove() {
        // Speichert alle selektierten Elemente Index in einem Array
        int[] selectedValuesM = listM.getSelectedIndices();
        int[] selectedValuesE = listE.getSelectedIndices();
      
        // Wenn kein Element selektiert ist, mach nichts!
        if (! (selectedValuesM.length < 1 || selectedValuesE.length < 1)) { // CHANGED
            // Enternt die Elemente aus dem ListModel
            listModel.remove(selectedValuesM[0]);
            listEntry.remove(selectedValuesE[0]);
          
            // Wiederhole remove() für die restlichen Elemente
            remove();
        }
    }
}
 
@MoxxiManagarm Vielen Dank 😀 Bei dem letzen if-Block meinst du warscheinlich nicht "1" sondern "!" aber ansonsten find ich es echt gut dass mir sogar der Aufwand genommen wurde meinen Code selber zu ändern. 😀 Wenn ich noch mal ein Problem habe Melde ich mich.
Ich kanns nicht oft genug sagen, danke 😀 Ich bin gerade noch ein bischen baff weil mir in nicht einmal einer Stunde von so vielen Leuten geholfen wurde. Echt super Seite hier!
 
Integer parsen sind so ein Fall, in dem man sinnvoll es nur über die Exception (oder selber parsen) sicher prüfen kann. Zu kleine/große Werte fallen sonst raus 😉
Wenn er denn tatsächlich ein Integer verwenden würde. Aber aktuell speichert er letztlich nur den String bestehend aus Zahlen. Ich sehe spontan keine Notwendigkeit, dass der String einen Integer darstellen können muss. Die Methode heißt zudem isNumeric, was theoretisch indiziert, dass auch "999999999999999999" true ergeben muss. Zusätzlich würde auch die Eingabe einer Negativen Zahl beim Parsen funktionieren. Ich vermute auch das ist nicht gewollt.
 
Zuletzt bearbeitet:

Zurück
Oben