Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
wie kann ich die Eingabe in einem JTextField beschränken? Ich habe ein Textfeld, da sollen nur Eingaben wie z. B. 1.0 oder 10.1 oder 100.1 erlaubt sein. Wie kann ich das realisieren? Es soll immer nur eine Stelle nach dem Punkt eingegeben werden können.
Vermutlich geht das mit einem Listener, der das bei der Eingabe ständig prüft. Bei einem JTextField ist das wohl ein DocumentListener auf dem Document des Textfeldes. In den Java Tutorials von Sun gibts auch Informationen.
public class Test extends JFrame {
public Test() {
DecimalFormat format = (DecimalFormat) NumberFormat.getNumberInstance(Locale.US);
format.setMaximumIntegerDigits(100);
format.setMaximumFractionDigits(1);
format.setGroupingUsed(false);
CNumberFormatter formatter = new CNumberFormatter(format);
JFormattedTextField formattedTextField = new JFormattedTextField();
formattedTextField.setFormatterFactory(new DefaultFormatterFactory(formatter));
formatter.setAllowsInvalid(false);
formatter.setValueClass(Double.class);
add(formattedTextField);
pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public class CNumberFormatter extends NumberFormatter {
private DecimalFormat format;
private int oldFracMin;
private int textLength;
public CNumberFormatter(DecimalFormat format) {
super(format);
this.format = format;
oldFracMin = format.getMinimumFractionDigits();
}
@Override
public Object stringToValue(String text) throws ParseException {
if (text.trim().length() > 0 && !text.equals(format.getNegativePrefix()) && !format.isParseIntegerOnly()) {
int index = text.indexOf(format.getDecimalFormatSymbols().getDecimalSeparator());
if (index == text.length() - 1 && textLength <= text.length()) {
format.setMinimumFractionDigits(format.getMaximumFractionDigits());
} else {
format.setMinimumFractionDigits(oldFracMin);
}
}
textLength = text.length();
return text.trim().length() == 0 || text.equals(format.getNegativePrefix()) ? null : super.stringToValue(text);
}
@Override
public String valueToString(Object value) throws ParseException {
String text = value == null ? "" : super.valueToString(value);
return text;
}
}
public static void main(String[] args) throws IOException {
new Test();
}
}
Falls irgendwas nicht passt oder sich falsch verhält musst die stringToValue methode abändern les dir einfach mal den link druch eventuell gehts noch einfacher...
aber solang das formatter.setAllowsInvalid(false); gesetzt ist kannst du keine falschen eingaben machen eigentlich auch kein punkt darum hab ich die mthode überschrieben...
wenn du formatter.setAllowsInvalid(true); kannst du falsche eingaben machen, ABER wenn du enter oder den fokus verlierst validiert das Textfeld und macht das richtige ergebnis dann brauchst du den formatter überhaupt nicht...
Je nachdem was du brauchst und wie es dir besser gefällt.