Java SE7 getpercentinstance

时间:2014-09-11 13:40:03

标签: java swing number-formatting

我有一个程序在使用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上)都有效。格式化文本有什么问题吗?

2 个答案:

答案 0 :(得分:1)

查看片段时会出现两个相关问题:

答案 1 :(得分:1)

问题是由percentInstance强制执行的格式化。如果您只输入一个没有%的数值,则验证失败,因此执行REVERT并且不会触发actionevent。如果您将%符号放入其中则会触发该事件。