2015-02-12 72 views
0

我想建立一个'哑'手机,因此我需要建立一个字母数字键盘。所以这个交易是针对每个按钮的,如果他们在一定的时间限制(2秒)内重复按下他们输入的字符改变。例如,按1输入A,但如果在2秒内再次按下,则输入变为B,然后如果在2秒内再次按下输入,则输入为C,依此类推。爪哇秋千字母数字键盘

已经有一个完全相关的问题(Swing alphanumeric keypad)。我一整天都在读它,试图让它有道理,但是我不能...

我想出了这样的东西(我知道这可能真的很愚蠢,但我的大脑真的让我失望了使其不那么愚蠢),以下代码位于1按钮的操作侦听器内部;

long buttn_last_pressed = System.currentTimeMillis(); 
    line.setText("A"); 
    if ((System.currentTimeMillis() - buttn_last_pressed) <= 2000) { 
     line1.setText("B"); } 

这样做的问题是输入总是出来作为B.我很坚持,我不能让我解决这个头,你可以从懵懂的代码中,我拿出见..任何帮助将非常感激, 非常感谢您提前! :)

回答

1

因此,如果我们看看这个片段中......

long buttn_last_pressed = System.currentTimeMillis(); 
line.setText("A"); 
if ((System.currentTimeMillis() - buttn_last_pressed) <= 2000) { 

除非line.setText("A");真的,真的很慢,这是不太可能需要2秒到达if声明...

你的意思更多的东西一样......

Button

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class JavaApplication787 { 

    public static void main(String[] args) { 
     new JavaApplication787(); 
    } 

    public JavaApplication787() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JTextField field; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      JButton btn = new JButton("1 ABC"); 
      btn.addActionListener(new ActionListener() { 
       private long lastClick = -1; 
       private int count; 
       private String[] value = {"1", "A", "B", "C"}; 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        long now = System.currentTimeMillis(); 
        if (now - lastClick < 2000) { 
         count++; 
         if (count >= value.length) { 
          count = 0; 
         } 
        } else { 
         count = 0; 
        } 
        field.setText(value[count]); 
        lastClick = System.currentTimeMillis(); 
       } 
      }); 
      field = new JTextField(4); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      add(btn, gbc); 
      add(field, gbc); 
     } 

    } 

} 

好吧,所有这些都是检查最后一次点击时间之间的差异,如果它小于2秒,它会更新count,指示要使用的当前值,否则将count重置为0,默认值为回到正常的钥匙...

btn.addActionListener(new ActionListener() { 
    private long lastClick = -1; 
    private int count; 
    private String[] value = {"1", "A", "B", "C"}; 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     long now = System.currentTimeMillis(); 
     if (now - lastClick < 2000) { 
      count++; 
      if (count >= value.length) { 
       count = 0; 
      } 
     } else { 
      count = 0; 
     } 
     field.setText(value[count]); 
     lastClick = System.currentTimeMillis(); 
    } 
}); 
+0

啊好吧好吧,我现在完全得到它 - 这样一个愚蠢的错误,我做了!..是的,这正是我想要做的,你是一个明星,非常感谢你! :) – MET 2015-02-12 16:48:44

+0

但我不gey为什么lastClick发起到-1,它会工作相同,如果不是,对不对? – MET 2015-02-12 16:54:32

+0

这是个人的事情,我倾向于将其设置为-1,所以我可以检查它是否设置,在这不是必需的 – MadProgrammer 2015-02-12 20:04:07