2011-10-30 48 views
3

对不起,我的英文。 我有一些JTextField和KeyListener的问题。 我有下面的代码:KeyListener不能使用JTextField

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

} 

的问题是,听者不工作。可能是什么原因? 如果我将添加鼠标侦听器,它的工作。 在此先感谢。

+0

界定“不工作”。怎么了? –

+2

而且您很少需要使用具有JTextField的KeyListener。更常见的情况是,如果您需要在提交之前捕获输入或在之后使用DocumentListener,则会使用DocumentFilter。 –

+0

简要回顾一下你的代码,我不会在这里使用一个键或鼠标监听器,而是在GUI中添加一个JButton,并从这些字段中提取数据,并调用wihin按钮的动作监听器进行计算。尽量保持简单。 –

回答

6

请勿为此使用KeyListener。通常我会使用DocumentListener来监听JTextField的Document,如果我想在JTextField中对变化做出反应,但即使这样也不适合这种类型的问题,因为您试图在字段完全填充之前进行计算,最初在其中一个JTextFields收到任何数据之前进行计算。

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