Как сохранить JFormattedTextField в режиме без перезаписи?

У меня проблема с JFormattedTextField, а именно сохранение его в режиме без перезаписи. Я узнал, как установить его без перезаписи, а именно с помощью setOverwriteMode (false).

Однако, хотя эта функция позволяет мне вводить текст в поле без перезаписи, когда фокус теряется и я повторно ввожу поле, overWriteMode снова включается!

Есть ли способ оставить overWriteMode ложным? Я бы предпочел решение, которое не устанавливает его в false каждый раз, когда я теряю фокус, но если это единственно возможное решение, пусть будет так.

Это то, что у меня есть сейчас:

    DefaultFormatter format = new DefaultFormatter();
    format.setOverwriteMode(false);

    inputField = new JFormattedTextField();
    inputField.setValue("don't overwrite this!");
    inputField.setColumns(20);
    format.install(inputField);// This does the trick only the first time I enter the field!

Я надеюсь, что кто-то может мне помочь!

Решение, предложенное Робином:

    DefaultFormatter format = new DefaultFormatter();
    format.setOverwriteMode(false);

    inputField = new JFormattedTextField(format); // put the formatter in the constructor
    inputField.setValue("don't overtype this!");
    inputField.setColumns(20);

Спасибо за помощь! С Уважением


person Tim Kuipers    schedule 17.09.2012    source источник
comment
каковы настоящие причины для DefaultFormatter#setOverwriteMode(false);, что вам действительно нужно   -  person mKorbel    schedule 17.09.2012
comment
Боковое примечание: обычно вы передаете средство форматирования в конструкторе JFormattedTextField вместо того, чтобы устанавливать его вручную. Это также задокументировано в javadoc метода install.   -  person Robin    schedule 17.09.2012
comment
@mKorbel: использование этой функции, кажется, в правильном направлении, но меня это не приводит, так как она работает только один раз. Мне нужно, чтобы поле оставалось в режиме без перезаписи. Возможно, setOverWriteMode(..) вообще не подходит, но я пока этого не знаю.   -  person Tim Kuipers    schedule 17.09.2012
comment
@Robin: Это помогло! Спасибо!   -  person Tim Kuipers    schedule 17.09.2012
comment
вы читали, потому что я думаю, что нет причин использовать это (и только использовать) для числового формата науки ....   -  person mKorbel    schedule 17.09.2012
comment
@mKorbel: формат научных чисел? Я просто хочу стринги!   -  person Tim Kuipers    schedule 17.09.2012
comment
@Tim Kuipers за то, чтобы Plain Vanilla String использовал DocumentFilter с Pattern, если изменения остаются внутри JTextComponents, в противном случае смотреть на DocumnetListener, JFormattedTextField — зло и сводить меня с ума несколько месяцев   -  person mKorbel    schedule 17.09.2012
comment
На данный момент это работает, поэтому я сохраню это решение. Спасибо за (возможно, лучшее) решение, хотя!   -  person Tim Kuipers    schedule 17.09.2012


Ответы (1)


выстрелил в темноту, есть что-то, что я пропустил

import java.awt.GridLayout;
import java.math.RoundingMode;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.text.NumberFormatter;

public class MaskFormatterTest {

    public static void main(String[] args) throws Exception {
        NumberFormat format = NumberFormat.getNumberInstance();
        format.setMaximumFractionDigits(2);
        format.setMinimumFractionDigits(2);
        format.setParseIntegerOnly(true);
        format.setRoundingMode(RoundingMode.HALF_UP);

        NumberFormatter formatter = new NumberFormatter(format);
        formatter.setMaximum(1000);
        formatter.setMinimum(0.0);
        formatter.setAllowsInvalid(false);
        //formatter.setOverwriteMode(false);

        JFormattedTextField tf = new JFormattedTextField(formatter);
        tf.setColumns(10);
        tf.setValue(123456789.99);
        JFormattedTextField tf1 = new JFormattedTextField(formatter);
        tf1.setValue(1234567890.99);
        JFormattedTextField tf2 = new JFormattedTextField(formatter);
        tf2.setValue(1111.1111);
        JFormattedTextField tf3 = new JFormattedTextField(formatter);
        tf3.setValue(-1111.1111);
        JFormattedTextField tf4 = new JFormattedTextField(formatter);
        tf4.setValue(-56);

        JFrame frame = new JFrame("Test");
        frame.setLayout(new GridLayout(5, 0));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(tf);
        frame.add(tf1);
        frame.add(tf2);
        frame.add(tf3);
        frame.add(tf4);
        frame.pack();
        frame.setVisible(true);
    }
}
person mKorbel    schedule 17.09.2012
comment
Я не знаю, что вы хотите сказать этим «Ответом», но когда я компилирую ваш код, я вообще не могу вводить текст. Это не помогло. - person Tim Kuipers; 17.09.2012
comment
может или не может работать, зависит от Formatter, используемого для JFormattedTextField, между прочим, этот из Funny Bugs, вы хотите еще 3-4, понятия не имею из вашего описания, в большинстве случаев запрашивают invokeLater(), потому что, вероятно, есть strange traffic (действительно есть это не так) между просмотрите модель, чтобы лучше помочь скорее опубликовать SSCCE - person mKorbel; 17.09.2012
comment
@Tim Kuipers надо подождать, может есть dirty хак, а может и нет - person mKorbel; 17.09.2012
comment
@Catalina Island, например, я рад, что после десятичного разделителя требуется только один ноль :-), в любом случае, спасибо ........ - person mKorbel; 17.09.2012
comment
@CatalinaIsland: Хороший улов автобокса. - person trashgod; 17.09.2012