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】:

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

NumberFormatstatic 实例将由您的TableCellRenderer所有 实例共享。

Swing 是 not thread safe,example 的格式化程序 NumberFormatDateFormat 也不是。验证 Swing GUI 对象是否在 event dispatch thread 上构造和操作。

【讨论】:

【参考方案2】:

问题在于 percentInstance 强制执行的格式设置。如果您只输入一个没有 % 的数值,则验证失败,因此会执行 REVERT 并且不会触发 actionevent。如果您输入 % 符号,它会触发该事件。

【讨论】:

以上是关于Java SE7 获取百分比实例的主要内容,如果未能解决你的问题,请参考以下文章

使用自己的 Java 代码和模型在 WEKA 中获取预测百分比

使用 spark java 获取列的每个值的特定百分比数据

java求两个数百分比,精确到指定位数

NumberFormat/ DecimalFormat

java面试总结2

利用Java实现断点上传