Java - JFormattedTextField AddActionListener

时间:2013-12-24 22:48:08

标签: java swing user-interface actionlistener

我一直在学习与Java GUI有关的知识。但是,我遇到了一个问题,我不确定如何修复它。

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

这是我的代码:

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)?

1 个答案:

答案 0 :(得分:3)

要删除逗号,只需使用不允许它们的格式化程序。如,

  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);

至于你的其他问题,如果你得到并设置了值而不是文本怎么办?

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保存的文本不合适,则可以避免讨厌的NumberFormatExceptions,不符合格式化程序。


顺便说一句,您的问题中发布的代码包含与您的问题无关的相当多的代码,并且不会为我们编译或运行。将来,请考虑仅发布显示问题所需的代码并允许代码运行,就像我上面发布的那样。


修改
你在评论中提问,

  

我怎样才能这样做,所以我不需要点击'Enter'来执行actionEvent?

你不能像ActionListeners那样为JTextFields和从JTextFields派生的类工作。我想你可以在JFormattedTextField的文档中添加一个DocumentFilter,如果你想在它自身显示之前弄乱字段的内容,但是当我将它们与JTextFields一起使用时,我从未使用它们与JFormattedTextFields一起使用的文档,并且不能说我从经验中知道这将起作用。