Java SE7 获取百分比实例
Posted
技术标签:
【中文标题】Java SE7 获取百分比实例【英文标题】:Java SE7 getpercentinstance 【发布时间】:2014-09-11 13:40:02 【问题描述】:我有一个程序在使用 NumberFormat.getPercentInstance 格式化的 JFormattedTextField 上使用 actionPerformed 侦听器。设置如下:
percentFormat = NumberFormat.getPercentInstance();
txtRPI = new JFormattedTextField(percentFormat);
percentFormat.setMinimumFractionDigits(1);
percentFormat.setMaximumIntegerDigits(2);
GridBagConstraints gbc_txtRPI = new GridBagConstraints();
gbc_txtRPI.insets = new Insets(0, 0, 5, 5);
gbc_txtRPI.gridx = 3;
gbc_txtRPI.gridy = 2;
gbc_txtRPI.anchor = GridBagConstraints.FIRST_LINE_START;
txtRPI.setValue(objParams.getRPI());
panTop.add(txtRPI, gbc_txtRPI);
txtRPI.setColumns(10);
txtRPI.addActionListener(new ActionListener ()
public void actionPerformed(ActionEvent e)
objParams.setRPI((double)txtRPI.getValue());
);
这一直很好,直到我在带有表格的不同 JPanel 上添加了以下代码:
public class MyPercentRender extends DefaultTableCellRenderer
/**
*
*/
private static final long serialVersionUID = 1L;
private static NumberFormat formatter = NumberFormat.getPercentInstance();
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
// First format the cell value as required
formatter.setMinimumFractionDigits(1);
formatter.setMaximumFractionDigits(2);
formatter.setMaximumIntegerDigits(2);
value = formatter.format((Number)value);
// And pass it on to parent class
return super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column );
添加后,第一个字段的 actionListener 停止被触发,因此我无法保存该值。
以前有没有人见过这种行为并且知道发生了什么?
感谢您的回复。我已经消除了静电。就作为事件调度线程的一部分而言,它是。
我已经尝试了更多的东西,似乎百分比实例是红鲱鱼。即使我把它拿出来,动作监听器也不会被解雇。我在创建对象后检查了对象,并且侦听器与其他对象一起注册
Class<T>
.
我用过这段代码
txtRPI = new JFormattedTextField();
GridBagConstraints gbc_txtRPI = new GridBagConstraints();
gbc_txtRPI.insets = new Insets(0, 0, 5, 5);
gbc_txtRPI.gridx = 3;
gbc_txtRPI.gridy = 2;
gbc_txtRPI.anchor = GridBagConstraints.FIRST_LINE_START;
txtRPI.setValue(objParams.getRPI());
txtRPI.setColumns(10);
txtRPI.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
objParams.setRPI((double)txtRPI.getValue());
);
panTop.add(txtRPI, gbc_txtRPI);
this.add(panTop, BorderLayout.PAGE_START);
但还是一样的结果。我所有的其他 actionListeners(在按钮和 ComboBox 上)都可以工作。格式化文本有什么问题吗?
【问题讨论】:
我做了一些实验。我在第一行将 getPercentInstance 更改为 getNumberInstance,它可以工作,但没有百分号。formatter.setMaximumIntegerDigits(3);
100%。
【参考方案1】:
查看片段时会出现两个相关问题:
NumberFormat
的static
实例将由您的TableCellRenderer
的所有 实例共享。
Swing 是 not thread safe,example 的格式化程序 NumberFormat
和 DateFormat
也不是。验证 Swing GUI 对象是否仅在 event dispatch thread 上构造和操作。
【讨论】:
【参考方案2】:问题在于 percentInstance 强制执行的格式设置。如果您只输入一个没有 % 的数值,则验证失败,因此会执行 REVERT 并且不会触发 actionevent。如果您输入 % 符号,它会触发该事件。
【讨论】:
以上是关于Java SE7 获取百分比实例的主要内容,如果未能解决你的问题,请参考以下文章