JFormattedTextfield und NumberFormat


#1

Folgender Code steht:

JTextField scaleTextField = new JFormattedTextField(NumberFormat.getInstance());
    ((NumberFormatter)((JFormattedTextField)scaleTextField).getFormatter()).setAllowsInvalid(false);
    scaleTextField.setColumns(4);
    scaleTextField.setText("100");

In dieses Textfeld sollen nur Zahlen eingegeben werden, da es den momentan Vergrößerungsfaktor beinhaltet und verändert werden kann. Wie oben geschrieben funktioniert das auch, nur ist jetzt das Problem, das nun Tausenderpunkte angezeigt werden… Das ist aber nicht im Sinne des Erfinders und trotz googelei immer nur wieder auf obiges gestoßen. Wie heißt ein Format, das nur Zahlen zulässt, aber keine Tausendertrennzeichen oä hinzufügt?


#2

Versuchs mal so:

NumberFormat nf = NumberFormat.getInstance(); nf.setGroupingUsed(false); JTextField scaleTextField = new JFormattedTextField(nf); ...


#3

Da ich grad das Problem habe… Wenn ich das so einfüge kann man Problemlos nur Zahlen ohne Gruppierung eingeben. Selbst negative Zahlen werden per +/- vom nummernpad automatisch eingefügt (Sehr praktisch), nur… was wenn ich PER PROGRAMM da eine negative Zahl einfügen möchte? setText(-100); als Beispiel geht nicht, kommt nur der Error-Sound von Windows, wie als würde ich fehlangaben im Textfeld vornehmen…

Dazu sind die Zahlen, die ich per Sout ausgebe immer positiv, werden trz mit dem Negativ-Zeichen angezeigt? Aber nur sobald eine negative Zahl reingeschrieben wurde.

Also zusammengefasst:

  1. es steht 0 drin
  2. Es schreibt z.B. 130 rein --> steht drin
  3. Es schreibt jetz z.B. -1 rein --> steht drin
  4. Es schreibt jetz z.B. -2 rein --> WIndows Fehlersound (Als wenn ich z.B: per hand ein ‘a’ oder so eingeben wollen würde)
  5. Es schreibt jetz z.B. 140 rein --> steht -140 drin

Jetz verschwindet das Negativzeichen nie mehr (Wenn ich es per Numpad entferne stehts bei der nächsten Programm-gesteuerten Eingabe mit ner Negativ-Zahl wieder drin und muss es per Hand entfernen.) und will ich ne neue Negativ-Zahl eingeben kommt nur der Errorsound (Also per Programm alles, per Hand funktioniert alles problemlos).

Also die Anzeige will nich wie ich will, Google findet leider auch nur wenig. Werd noch weitersuchen, aber evtl hat ja wer ne Lösung für dieses Komische Phänomen…


#4

Ich würde sagen, dieses Verhalten ist recht ungewöhnlich. Etwas mehr Code, speziell über die Zeilen in welchen die Felder manipuliert werden, wäre gut.

Ich hätte für dieses Problem aber ein neues Thema eröffnet, weil dieses hier bereits auf gelöst steht.


#5

Ja, aber da das Problem ja offensichtlich nich gelöst war, dachte ich ich machs einfach wieder hier rein, kann das gelöst ja noch umändern.

Hier nen kskb dazu:

import java.awt.BorderLayout;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.NumberFormatter;

/**
 *
 * @author Andy
 */
public class TextFieldBug {

    @SuppressWarnings({"SleepWhileInLoop", "CallToPrintStackTrace"})
    public static void main(String[] args) {
        JFrame f = new JFrame("Test");
        f.getContentPane().setLayout(new BorderLayout());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);

        NumberFormat nf = NumberFormat.getInstance();
        nf.setGroupingUsed(false);

        JTextField textField = new JFormattedTextField(nf);
        ((NumberFormatter) ((JFormattedTextField) textField).getFormatter()).setAllowsInvalid(false);
        textField.setColumns(4);
        textField.setText("0");
        textField.setHorizontalAlignment(JTextField.RIGHT);

        new Thread(() -> {
            boolean positive = false;
            for (int i = 0;;) {
                if (!positive) {
                    i++;
                    if (i == 5) {
                        positive = true;
                    }
                } else {
                    i--;
                    if (i == -5) {
                        positive = false;
                    }
                }
                System.out.println(" Gebe aus: " + i);
                textField.setText(i + "");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        }).start();

        f.getContentPane().add(textField);
        f.pack();
        f.setVisible(true);
    }

}

#6
  1. (rein formell) Nicht setString(i+"") sondern setString(String.valueOf(i)) :wink:
  2. wo setzt du .setOverwriteMode(true)?

Aber iwie stimme ich dir zu. Der Overwritemode sollte standardmäßig gesetzt sein und nicht erst gesetzt werden müssen. :wink:


#7

Wusste nichmal das das existiert bzw notwendig is… Hatte mit den Formattern nie wirklich groß was am Hut. Danke, das löst das ganze.