gpt4 book ai didi

java - 如何在 Swing 中定义格式化文本字段,以便在您键入时应用格式限制?

转载 作者:行者123 更新时间:2023-11-29 07:05:42 27 4
gpt4 key购买 nike

我在 JFrame 上需要这样一个数字文本字段

  1. 限制输入小数点后两位数点
  2. 列出每三位数字分隔的数字,即 1234 567,89。
  3. 数字立即以正确的格式显示打字时

我尝试使用 JFormattedTextField:

    NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
NumberFormatter numFormater = new NumberFormatter(nf);
field1 = new javax.swing.JFormattedTextField(numFormater);

但是,格式限制仅在焦点离开组件时适用,这是一个问题。我希望用户只能在字段中键入数字和分隔符,并在字段中输入每个 3-d 数字后立即放置一个空格分隔符。

我可以在 C# 中通过指定字段的属性来做到这一点。在 Swing 中执行此操作的干净方法是什么?谢谢。

最佳答案

  • 其中一种方法是使用 InternationalFormatter,它是 Number 或 DecimalFormatter

    的附加 Formatter
  • JFormattedTextField 中的每个限制都会对用户输入产生副作用,例如插入符选择

  • 适当的方法可以是使用组合 DocumentFilterDocumentListener 添加到 JFormattedTextField 与普通 Number 或 DecimalFormatter,没有任何限制,所有解决方法都将在 DocumentFilter(指定用于 Document 内的更改)和 DocumentListener(Document 外)中设置)

例如提到的InternationalFormatter

import java.awt.*;
import java.math.*;
import java.text.*;
import javax.swing.*;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.JFormattedTextField.AbstractFormatterFactory;
import javax.swing.text.InternationalFormatter;

public class DocumentListenerAdapter {

public DocumentListenerAdapter() {
JFrame frame = new JFrame("AbstractTextField Test");
final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01));
textField1.setFormatterFactory(new AbstractFormatterFactory() {
@Override
public AbstractFormatter getFormatter(JFormattedTextField tf) {
NumberFormat format = DecimalFormat.getInstance();
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.HALF_UP);
InternationalFormatter formatter = new InternationalFormatter(format);
formatter.setAllowsInvalid(false);
formatter.setMinimum(0.0);
formatter.setMaximum(1000.00);
return formatter;
}
});
NumberFormat numberFormat = NumberFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMaximumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
final JFormattedTextField textField2 = new JFormattedTextField(numberFormat);
textField2.setValue(new Float(10.01));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(textField1, BorderLayout.NORTH);
frame.add(textField2, BorderLayout.SOUTH);
frame.setVisible(true);
frame.pack();
}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new DocumentListenerAdapter();
}
});
}
}

例如JSpinner (editor is JFormattedTextField) with very simple DocumentFilter

关于java - 如何在 Swing 中定义格式化文本字段,以便在您键入时应用格式限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20142407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com