首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java - JFormattedTextField AddActionListener

Java - JFormattedTextField AddActionListener
EN

Stack Overflow用户
提问于 2013-12-24 22:48:07
回答 1查看 212关注 0票数 2

我一直在学习更多与Java相关的知识。然而,我遇到了一个问题,我不知道如何解决它。

我有我的程序的一部分(显示在下面,但不相关的代码已经被删除),除了JFormattedTextField变量(sliderField)之外,一切都可以工作。我想要做的是,如果一个值被输入到大于5000的sliderField中,并且面板刷新(已经在其他地方完成了),则字段将更改为5000。但是,由于某些原因,actionPerformed似乎没有在我的JFormattedTextField中注册任何类型的更改,也阻止了变量的更改。

这是我的代码:

代码语言:javascript
复制
public class testMenu extends JPanel implements ActionListener, ChangeListener {
    public testMenu(GUI p) {
        parent = p;
        setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0));
        createPanel();
        setVisible(true);
    }

    public void createPanel() {
        createOptions();
    }

    private void createOptions() {
        options[0] = new JPanel();
        add(options[0]);

        options[1] = new JPanel();
        add(options[1]);

        options[2] = new JPanel();
        add(options[2]);

        options[3] = new JPanel();
        add(options[3]);

        options[4] = new JPanel();
        add(options[4]);

        slider = new JSlider(0, 5000, 0);
        slider.setPaintTicks(true);
        slider.setValue(parent.variable);
        slider.addChangeListener(this);
        sliderField = new JFormattedTextField(NumberFormat.getInstance());
        sliderField.setText(Integer.toString(parent.variable));
        sliderField.setColumns(4);
        sliderField.addActionListener(this);

        options[5] = new JPanel();
        options[5].add(new JLabel("Slider Value:"));
        options[5].add(slider);
        options[5].add(sliderField);
        options[5].setVisible(false);

        add(options[5]);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == sliderField) {
            int size = Integer.parseInt(sliderField.getText());
            System.out.println(size);
            if (size > 5000) {
                sliderField.setText("5000");
                size = 5000;
            }
            parent.setVariable("" + size);
        }
    }

    private GUI parent;

    private JSlider slider;
    private JFormattedTextField sliderField;

    private JPanel[] options = new JPanel[5];
}

我的问题很简单:为什么actionPerformed不注册在JFormattedTextField上执行的任何操作,以及如何修复它?

另外,我如何设置我的JFormattedTextField,以便如果值大于999,则不添加逗号(防止1000显示为1,000)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-24 22:56:36

要去掉逗号,只需使用不允许它们的格式化程序即可。例如,

代码语言:javascript
复制
  NumberFormat format = NumberFormat.getInstance();
  format.setGroupingUsed(true);  // *** set it so it doesn't use a grouping ***
  final JFormattedTextField formattedField = new JFormattedTextField(format);
  formattedField.setColumns(10);

至于你的另一个问题,如果你得到和设置的值而不是文本呢?

代码语言:javascript
复制
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class TestJFormattedText {
   public static void main(String[] args) {
      NumberFormat format = NumberFormat.getNumberInstance();
      format.setGroupingUsed(false);
      final JFormattedTextField formattedField = new JFormattedTextField(format);
      formattedField.setColumns(10);

      formattedField.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            long value = ((Long)formattedField.getValue()).longValue();
            if (value > 5000) {
               formattedField.setValue(5000);
            }
         }
      });


      JPanel panel = new JPanel();
      panel.add(formattedField);
      JFrame frame = new JFrame("Foo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(panel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }
}

使用值的一个优点是,如果JFormattedTextField持有的文本不合适,则避免使用烦人的JFormattedTextField,而不符合格式化程序。

顺便说一句,您在问题中发布的代码包含了大量与您的问题无关的代码,没有为我们编译或运行。将来,考虑只发布显示问题和允许代码运行所需的代码,就像我在上面发布的一样。

编辑

你要评论一下,

如何才能使actionEvent执行时不需要按“Enter”键?

您不能这样做,因为这就是ActionListeners对JTextFields和从JTextFields派生的类的工作方式。如果您想在JFormattedTextField文档本身显示之前修改该字段的内容,我想您可以在JFormattedTextField文档中添加一个DocumentFilter,但是虽然我在JTextFields中使用了这些内容,但我从未将它们用于与JFormattedTextFields一起使用的文档,并且不能说我从经验中知道这是可行的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20767518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档