我有一个程序,它在使用 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 停止被触发,因此我无法保存该值。
有人以前见过这种行为并知道发生了什么吗?
<小时/>感谢您的回复。我已经把静电去掉了。就事件派发线程的一部分而言,它是。
我又尝试了一些东西,看来百分比实例是一个转移注意力的东西。即使我把它拿出来, Action 监听器也不会被解雇。我在创建后检查了该对象,并且监听器与其中之一一起注册
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);
但结果还是一样。我的所有其他 Action 监听器(在按钮和组合框中)都可以工作。有关于格式化文本的内容吗?
最佳答案
查看片段时会出现两个相关问题:
NumberFormat
的静态
实例将由TableCellRenderer
的所有实例共享。Swing 是 not thread safe格式化程序也不是,
NumberFormat
和DateFormat
,对于 example 。验证 Swing GUI 对象是否仅在 event dispatch thread 上构建和操作。 .
关于Java SE7 getpercent实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25789001/