Ä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.
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);
}
}
});
Ich habe es nirgendwo geschrieben.