[JAVA] Beispielquellcode der Eingabebeschränkungsfunktion von JTextField (Beispielvalidierung: numerischer Wert von 1 bis 30)

Hinweis

Ändern Sie die Werte von LowerLimit und UpperLimit und verwenden Sie sie. Unabhängig davon, welches Zeichen Sie eingeben, können Sie nur die Zahlen 1 bis 30 mit halber Breite eingeben. DocumentFilter ist besser, um eine innere Klasse zu erstellen.

Quellcode

Example


JTextField textField = new JTextField();
((PlainDocument)textField.getDocument()).setDocumentFilter(new DocumentFilter() {
    /**
     *Begrenzt auf 1 bis 30 bei der Eingabe von Nummern
     * @param fb
     * @Param Offset Cursor Position
     * @Parameterlänge Anzahl der Ersatzzeichen
     * @Parameter Text Ersatzzeichenfolge
     * @param attrs fb.getDocument().getDefaultRootElement().getAttributes()Gleich wie
     */
    @Override 
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
      throws BadLocationException
        int lowerLimit = 1;
        int upperLimit = 30;

        int valueInput = 0;
        try {
            valueInput = Integer.parseInt(text);
        } catch(Exception ex) {
            //Andere Eingabewerte als numerische Werte können nicht eingegeben werden
            return;
        }
        //Wenn der Eingabewert eine Zahl mit voller Breite ist, wird er automatisch in eine Zahl mit halber Breite konvertiert.
        text = String.valueOf(valueInput);
        //Wenn ursprünglich kein Zeichen eingegeben wurde
        if(fb.getDocument().getLength() == 0) {
            //Es können nur die Zeichen 1-9 eingegeben werden
            if(valueInput != 0) {
                super.insertString(fb, offset, text, attrs);
            }
            return;
        }

        //Wenn Zeichen ursprünglich eingegeben wurden
        } else {
            //Wertberechnung nach Eingabe
            String strAlready = fb.getDocument.getText(0, fb.getDocument().getLength());
            int valueAlready = Integer.parseInt(strAlready);
            int valueTotal = 0;
            if(offset == 0) {
                // Input Left
                valueTotal = (int) (valueInput * Math.pow(10, strAlready.length()) + valueAlready);
            } else if(offset == strAlready.length()) {
                // Input Right
                valueTotal = (int) (valueAlready * 10 + valueInput);
            } else {
                // Input Mid
                int valueLeft  = (int) ( Integer.parseInt(strAlready.substring(0, offset))
                                        * Math.pow(10, strAlready.length()-offset+1) );
                int valueAdd   = (int) ( valueInput * Math.pow(10, strAlready.length()-offset) );
                int valueRight = Integer.parseInt( strAlready.substring(offset, strAlready.length()) );
                valueTotal = valueLeft + valueAdd + valueRight;
            }
            //Begrenzen Sie die Eingabewerte von 1 auf 30
            if(valueTotal > upperLimit) {
                //Wert nach Eingabe>Maximalwert
                super.remove(fb, 0, strAlready.length()); //Löschen Sie alle Originalzeichen
                if(valueInput != 0) {
                    super.insertString(fb, 0, String.valueOf(valueInput), attrs); //Eingabewerteinstellung
                } else {
                    super.insertString(fb, 0, String.valueOf(upperLimit), attrs); //Maximalwerteinstellung
                }
            } else if(valueTotal < lowerLimit) {
                super.replace(fb, 0, strAlready.length(), String.valueOf(lowerLimit), attrs); //Minimalwerteinstellung
            } else {
                super.replace(fb, offset, length, text, attrs); //Ersetzen Sie den Methodenverarbeitungsaufruf, wenn der ursprüngliche Wert eingegeben wird
            }
        }
    }

    /**
     *Beim Löschen eines Wertes kann kein Wert kleiner als 1 eingegeben werden.
     * @param fb
     * @Param Offset Cursor Position
     * @Parameterlänge Anzahl der zu löschenden Zeichen
     */
    @Override 
    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
        int lowerLimit = 1;

        String strBefore = fb,getDocument.getText(0, fb.getDocument().getLength());
        String strAfter  = strBefore.substring(0, offset)
                           + strBefore.substring(offset+length, fb.getDocument().getLength());
        int afterValue = 0;
        try {
            afterValue = Integer.parseInt(strAfter);
        } catch(Exception ex) {
            //Da der Eingabewert gesteuert wird, sollte kein Fehler auftreten.
        }
        //Wert kann nicht kleiner als 1 eingestellt werden
        if(strAfter.length() == 0 || afterValue < lowerLimit) {
            //Wenn kein Wert eingegeben oder ein Wert kleiner als der Mindestwert festgelegt wird, wird der Mindestwert festgelegt.
            super.replace(fb, 0, strBefore.length(), String.valueOf(lowerLimit), fb.getDocument().getDefaultRootElement().getAttributes());
        } else {
           //Rufen Sie die Methode zum Entfernen der Methode auf, wenn Sie den ursprünglichen Wert löschen
           super.remove(fb, offset, length);
        }
    }
});

Warum ich das geschrieben habe

Ich habe es nirgendwo geschrieben.

Recommended Posts

Beispielquellcode der Eingabebeschränkungsfunktion von JTextField (Beispielvalidierung: numerischer Wert von 1 bis 30)
[Java] Fluss vom Quellcode zur Ausführung
Beispielcode zum Zuweisen eines Werts in der Eigenschaftendatei zu einem Feld des erwarteten Typs