KeyListener не работает с JTextField - PullRequest
       30

KeyListener не работает с JTextField

3 голосов
/ 30 октября 2011

Извините за мой английский.У меня есть некоторые проблемы с 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");
        }
    };

}

Проблема в том, что слушатель не работает.Что может быть причиной?Если я добавлю слушателя мыши, что это работает.Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 30 октября 2011

Не используйте KeyListener для этого. Часто я использую DocumentListener для прослушивания Document JTextField, если бы я хотел реагировать на изменения после того, как они были помещены в JTextField, но даже это не подходит для такого типа проблемы, так как вы пытаетесь рассчитать до того, как поля будут полностью заполнены, и первоначально до того, как одно из JTextFields вообще получит какие-либо данные.

Гораздо лучше было бы добавить JButton в ваш графический интерфейс, и в этом ActionListener JButton извлекать и анализировать текст из полей JTextFields, вызывать метод Calculate и отображать результаты вычислений. Таким образом, вы не получите преждевременных результатов, а будете выполнять вычисления только после того, как пользователь введет информацию и решит, что введенные данные действительны, и теперь настало время для расчетов. Вы даже можете отключить кнопку, пока оба JTextFields не будут содержать данные (DocumentListener может хорошо работать для этого).

2 голосов
/ 30 октября 2011

для TextComponents есть DocumentListener и для Numbers есть JFormattedTextField , а с Number Formatter не позволяет вводить только цифры и десятичный разделитель, простой пример здесь

...