- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经创建了 JFormattedTextField 的自定义组件 (NumberFormattedTextField)。这是我使用的格式化程序:
public static InternationalFormatter getDecimalIFormatter92() {
// For Buy & Sale Price
DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMinimumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
numberFormat.setGroupingUsed(false);
final InternationalFormatter formatter = new InternationalFormatter(numberFormat);
formatter.setAllowsInvalid(false);
formatter.setMinimum(0.00);
formatter.setMaximum(999999999.99);
return formatter;
}
当我创建 NumberFormattedTextField 实例时:
public RelationsPanel(CashParent parent) {
try {
initComponents(); // startBalTxt = new NumberFormattedTextField();
Utility.logInfo("initComponents OVER");
myParent = parent;
nameTxt.setSizeLimit(20);
System.out.println("startBalTxt.setFormatter GOING FOR IT");
this.startBalTxt.setFormatter(Utility.getDecimalIFormatter82()); // Must be throwing here
System.out.println("startBalTxt.setFormatter DONE");
this.currentBalTxt.setFormatter(Utility.getDecimalIFormatter82());
} catch (Exception e) {
Utility.logInfo("Failed to Initialize : " + e.getMessage());
e.printStackTrace();
}
}
NumberFormattedTextField 类代码:
public class NumberFormattedTextField extends JFormattedTextField implements java.io.Serializable, DocumentListener, FocusListener {
private DecimalFormat numberFormat;
private InternationalFormatter formatter;
private double MAX_VALUE = 999999.99;
private final Map attributes = (Utility.getTextFont()).getAttributes();
/**
* Creates a NumberFormattedTextField with 6 Integer & 2 Fractional digits.
* Minimum is set to 0.00 and Max to 999999.99 without any grouping used.
*/
public NumberFormattedTextField() {
super();
createFormatter(); // Creates a default formatter, used if formatter is not set
this.setValue(0.00);
init();
}
private void createFormatter() {
// Create standard DecimalFormat
numberFormat = (DecimalFormat) DecimalFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMinimumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
numberFormat.setGroupingUsed(false);
formatter = new InternationalFormatter(numberFormat);
formatter.setAllowsInvalid(false);
formatter.setMinimum(0.00);
formatter.setMaximum(999999.99);
this.setFormatterFactory(new AbstractFormatterFactoryImpl());
}
private void init() {
setFont(Utility.getTextFont());
this.getDocument().addDocumentListener(this);
this.addFocusListener(this);
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
setFocusLostBehavior(PERSIST);
}
public void setFormatter(InternationalFormatter format) {
super.setFormatter(format);
System.out.println("Class of Format = " + format.getFormat().getClass());
if (format.getFormat() instanceof java.text.DecimalFormat)
numberFormat = (DecimalFormat)format.getFormat();
else
numberFormat = (DecimalFormat)(NumberFormat) format.getFormat();
formatter = format;
// AbstractFormatterFactoryImpl returns formatter straight away
this.setFormatterFactory(new AbstractFormatterFactoryImpl());
calculateMaxValue();
}
private void calculateMaxValue() {
try {
if (formatter.getMaximum() != null) {
//System.out.println(" MAX ALlowed = " + formatter.getMaximum());
String no = formatter.valueToString(formatter.getMaximum());
char seperator = java.text.DecimalFormatSymbols.getInstance().getGroupingSeparator();
no = no.replace(String.valueOf(seperator), "");
System.out.println("MAX Number to PArse = " + no);
MAX_VALUE = Double.parseDouble(no); // HERE ITS THROWING EXCEPTION
}
} catch (ParseException ex) {
Logger.getLogger(NumberFormattedTextField.class.getName()).log(Level.SEVERE, null, ex);
}
}
上述代码在我的电脑上运行良好。但是在客户端的 PC 上它给出了错误: 初始化失败:对于输入字符串:“99999999,99”我得到的错误/日志:
startBalTxt.setFormatter GOING FOR IT
INFO: initComponents OVER
Class of Format = class java.text.DecimalFormat
MAX Number to PArse = 99999999,99
INFO: Failed to Initialize : For input string: "99999999,99"
java.lang.NumberFormatException: For input string: "99999999,99"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
at java.lang.Double.parseDouble(Double.java:540)
at cashaccountingapp.components.NumberFormattedTextField.calculateMaxValue(NumberFormattedTextField.java:184)
Class of Format = class java.text.DecimalFormat
at cashaccountingapp.components.NumberFormattedTextField.setFormatter(NumberFormattedTextField.java:173)
at cashaccountingapp.data.RelationsPanel.<init>(RelationsPanel.java:35)
我们两个的语言环境不同。
这个错误的原因是什么?在我的 NumberFormattedTextField 类中需要注意的不同区域设置或其他内容。我希望应用程序适应系统设置并相应地显示。
如何解决问题??
最佳答案
最有可能(不能完全确定,因为您没有显示初始设置并且仅将错误削弱到其消息中;-)不同的区域设置是原因:一个将句点作为小数点,另一个将逗号。因此,如果您使用表示另一个中的数字的字符串初始化一个,它将发生冲突:逗号未被解释为小数点分隔符,因此最大值太大而无法满足限制
关于Java : Does Locale affect the Formatter for JFormattedTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8635480/
我有一个带有 DateFormat 的 JFormattedTextField。格式为“ddMMyy”。这种格式允许快速输入。当焦点丢失时,我希望字段中的文本更改为 LocalDate,因为这样更易于
嘿伙计们,我想知道是否可以将 JFormattedTextField 设置为具有电子邮件输入的自动格式。例如,当用户输入电子邮件地址时,我希望它接受如下内容:jsmith1@smith.com 但我希
我在代码中使用时间时遇到了一些麻烦: txtDauer = new JFormattedTextField(); txtDauer.setFormatterFactory(new DefaultFor
我想使用 JFormattedTextField 将 float 格式化为百分比值,允许输入从 0 到 100%(转换为 0.0f-1.0f),始终显示百分号并不允许任何无效字符。 现在我对 Numb
我有此代码,但无法正确获取MaskFormatter maskformatter MaskFormatter formatter = null; try { formatter = new
我正在扩展 JFormattedTextField 以添加监听器。我已经完成了这项工作,尽管这可能不是最好的方法。没有办法使用单个泛型构造函数吗? public class TimeLineTextC
我想获取 JFormattedTextField 的值并将其转换为字符串这是我的 JFormattedTextField 代码 这是我的代码: public void formattedTextFie
我有一个字符数组列表,还有一个返回字符串的 JTextField。我想知道如何只允许输入字符?或者也许我如何只允许传递字符串的第一个字母? 最佳答案 所以您只想允许输入某些字符,即由ArrayList
我正在做这个作业,制作一个解决数独的程序。我有一个带有 SudokuTextBox 网格扩展 JFormattedTextField 的面板。我有一个 MaskFormatter,因此每个文本框只接受
我正在尝试在 Beanshell 中创建一个简单的对话框 - 它应该读取三个可编辑文本字段的内容,并在按下按钮时相应地执行一个简单的任务。我完全被一个错误所困扰,我无法阅读某些字段中的文本。 代码如下
我有一个用于“名称”字段的 jFormattedTextFiled。我必须限制字段只能输入 25 个字符。如果输入更多,则必须显示一些消息...对于消息我可以使用 JOptionpane.. 我该怎么
我有一个正在使用代码初始化的 JFormattedTextField JFormattedTextField f = new JFormattedTextField(createFormatter()
假设JFormattedTextField已启用并包含格式化程序,有没有办法使其只读?使用JTextField,我们只需要提供一个自定义文档并在那里进行所有控制,但是使用JFormattedTextF
我需要一个限制为小数点后 3 位的 JTextField。经过搜索,我发现了 JFormattedTextField,它看起来很棒。现在的代码是: try { double aux = 25.
我的 GUI 程序中有以下 JFormattedTextField。 DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); JFormattedTex
如何编写 JFormattedTextField 代码以接受不带小数的货币格式? 我尝试到处寻找答案。具体来说,是 Oracle、Google 和 Code Ranch。 我的问题:如何对格式化文本字
我在这里遇到麻烦了,我正在尝试创建一个创建 JFormattedTextFields 的类,它可以工作,但我需要获取它的值,那就是我得到 NullPointerExeption 的时候,这是我的代码:
我正在使用 GUI 制作一个小型数独游戏,并为 JFormattedTextFields 使用 MaskFormatter: formatter = new MaskFormatter(s); f
我一直在学习更多与 Java GUI 相关的知识。但是,我遇到了一个问题,不确定如何解决。 我有一部分程序(如下所示,但不相关的代码已被删除),除了 JFormattedTextField 变量 (s
由于有人错误地将我的另一个问题( NumberFormat parse not strict enough )标记为重复,并且尽管我指出它是不同的但没有删除重复的标签,所以我将再次发布该问题以及我的解
我是一名优秀的程序员,十分优秀!