我有一个程序在使用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上)都有效。格式化文本有什么问题吗?
答案 0 :(得分:1)
查看片段时会出现两个相关问题:
static
的{{1}}实例将由NumberFormat
的所有实例共享。
Swing为not thread safe,格式器NumberFormat
和DateFormat
也不是example。验证是否在event dispatch thread上仅构建和操作Swing GUI对象。
答案 1 :(得分:1)
问题是由percentInstance强制执行的格式化。如果您只输入一个没有%的数值,则验证失败,因此执行REVERT并且不会触发actionevent。如果您将%符号放入其中则会触发该事件。