【问题标题】:KeyListener does not work with JTextFieldKeyListener 不适用于 JTextField
【发布时间】:2011-12-18 07:05:51
【问题描述】:

对不起我的英语。 我对 JTextField 和 KeyListener 有一些问题。 我有下面的代码:

package com.gugnovich.tasks;   
@SuppressWarnings("serial")
public class Task1Panel extends Task {

    private static final String zLabel = "Please enter Z:";
    private static final String eLabel = "Please enter E:";
    private static final double K = 1.4;

    private JTextField zField;
    private JTextField eField;
    private JTextField result;

    private double zVal;
    private double eVal;
    private double resultVal;


    @Override
    protected void displayTaskPanel() {
        /** Panel settings */
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setBorder(new EmptyBorder(10, 15, 10, 10));
        /** Add title of the task */
        JLabel title = new JLabel(Constants.TASK1_TITLE + ":");
        title.setFont(new Font("Monospaced", Font.BOLD, 18));
        add(title);
            /**
              Form builder
             */
        DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout(""));
        builder.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        builder.setBackground(Color.decode(Constants.BACKGROUND_COLOR));
            /**
              Add columns
             */
        builder.appendColumn("left:pref");
        builder.appendColumn("3dlu");
        builder.appendColumn("fill:max(pref; 100px)");

        builder.appendSeparator("Enter params");
            /**
              Field for Z
             */
        zField = new JTextField();
        builder.append(zLabel, zField);
        zField.addKeyListener(listener);
             /**
              Field for E
             */
        eField = new JTextField();
        builder.append(eLabel, eField, true);
        eField.addKeyListener(listener);

        builder.appendSeparator("Result");
            /**
               result field
            */
        result = new JTextField();
        result.setEnabled(false);
        result.setDisabledTextColor(Color.BLACK);
        builder.append("X = ", result);

        add(builder.getPanel());
    }
    /**
     listener
    */
    private KeyListener listener = new KeyListener() {

        @Override
        public void keyTyped(KeyEvent e) {
            System.out.println("Typed");
            JTextField zf = (JTextField) e.getSource();
            zVal = Double.parseDouble(zf.getText());
            JTextField ef = (JTextField) e.getSource();
            eVal = Double.parseDouble(ef.getText());
            if (zVal > 0.00 && eVal > 0.00) {
                calculate();
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("Released");
        }

        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("Pressed");
        }
    };

}

问题是监听器不起作用。可能是什么原因? 如果我将添加鼠标侦听器,它可以工作。 提前致谢。

【问题讨论】:

  • 定义“不起作用”。会发生什么?
  • 而且您很少需要将 KeyListener 与 JTextField 一起使用。如果您需要在提交之前捕获输入,或者在之后需要捕获输入,您通常会使用 DocumentFilter。
  • 在简要回顾您的代码时,我不会在这里使用键或鼠标侦听器,而是将 JButton 添加到 GUI 并从字段中提取数据并从按钮的动作侦听器中调用计算.尽量保持简单。
  • “不起作用” = 事件未发生

标签: java swing jtextfield keylistener


【解决方案1】:

TextComponentsDocumentListenerNumbersJFormattedTextFieldNumber Formatter 不允许只输入数字和小数点分隔符,这里是简单的example

【讨论】:

    【解决方案2】:

    不要为此使用 KeyListener。如果我想在将更改放入 JTextField 后对更改做出反应,我通常会使用 DocumentListener 来收听 JTextField 的 Document,但即使这样也不适合此类问题,因为您会尝试在字段被完全填写之前计算,并且最初在其中一个 JTextField 接收到任何数据之前。

    更好的做法是在您的 GUI 中添加一个 JButton,并在该 JButton 的 ActionListener 中从 JTextField 中提取和解析文本,调用计算方法并显示计算结果。这样您就不会得到过早的结果,而只会在用户输入信息并确定输入的数据有效并且现在是进行计算的时候才进行计算。您甚至可以禁用该按钮,直到两个 JTextField 都包含数据(DocumentListener 可以很好地解决此问题)。

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多