使用相同的按钮在文本框中输入不同的文本
我正在使用计数器根据按钮单击次数插入数字。只涉及一个按钮。当该按钮被按下一次时,它应该在文本字段中输入1。如果在3秒内再次按下该按钮,则应将1替换为2.如果在3秒后按下该按钮,则应以相同的方式输入下一个数字。我在下面添加了我的代码。使用相同的按钮在文本框中输入不同的文本
我在这个程序中遇到了一些麻烦。当我在3秒内按下按钮两次时,它会在JTextField中输入“12”。在输入一位数字后,我也无法重置计数器。希望您理解我的问题。
package timertry;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class TimerTry extends JFrame implements ActionListener{
public JFrame panel1;
JTextField tf;
JButton button;
int counter=0;
public TimerTry() {
panel1=new JFrame("Single button keypad try");
panel1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
tf=new JTextField();
tf.setEnabled(false);
tf.setHorizontalAlignment(JTextField.CENTER);
button=new JButton();
}
public void launchFrame(){
panel1.setLayout(null);
panel1.setVisible(true);
panel1.setExtendedState(JFrame.MAXIMIZED_BOTH);
panel1.add(tf);
tf.setSize(300, 50);
tf.setLocation(500, 150);
tf.setEnabled(false);
tf.setHorizontalAlignment(JTextField.CENTER);
panel1.add(button);
button.setSize(360,50);
button.setLocation(900, 250);
button.setLabel("Press");
button.setHorizontalAlignment(JTextField.CENTER);
button.addActionListener(this);
}
public static void main(String[] args) {
// TODO code application logic here
TimerTry tt=new TimerTry();
tt.launchFrame();
}
@Override
public void actionPerformed(ActionEvent e) {
Thread thread=new Thread(){
@Override
public void run(){
try{
sleep(3000);
counter++;
if(counter==1){
tf.setText(tf.getText()+counter);
}
else if(counter==2){
tf.setText(tf.getText()+counter);
}
else if(counter==3){
tf.setText(tf.getText()+counter);
}
else {
tf.setText(tf.getText()+counter);
}
}
catch(Exception ex){
ex.printStackTrace();
}
}
};
thread.start();
}
}
这是你的问题:
if(counter==1){
tf.setText(tf.getText()+counter);
}
else if(counter==2){
tf.setText(tf.getText()+counter);
}
else if(counter==3){
tf.setText(tf.getText()+counter);
}
else {
tf.setText(tf.getText()+counter);
}
之前每个tf.setText(tf.getText() + counter);
甚至更好只需添加tf.setText("");
,这一个改变你的try-catch
。
try{
sleep(3000);
counter++;
tf.setText(String.valueOf(counter));
}
catch(Exception ex){
ex.printStackTrace();
}
,而不是从tf
只是设置文本获取文本,它将取代,而不是重新加入它有文字。
你的程序做:
1 CLIC
tf
= 1
,那么你在一个假想的String
得到姑且称之为textOfTF
textOfTF
= 1
2 CLIC
textOfTF
= 1(因为你从tf.getText()
得到它)2
所以
textOfTF
= 12
等。
而作为建议不要在秋千应用上使用thread.sleep()
,我会推荐使用Swing Timer。
thread.sleep()
将使您的应用程序冻结,同时摆动计时器没有。
这就是要掩盖问题。真正的问题在于OP的方法。 – dasblinkenlight 2014-08-29 17:21:12
yep刚刚注意到他正在从textfield获取文本并将其添加到计数器中。请参阅编辑@dasblinkenlight – Frakcool 2014-08-29 17:22:08
有许多与你当前的方法问题....
- 一个新的,独立的,
Thread
每个按钮被点击一次你产卵。每个Thread
等待3秒,并且计数器的增量无论如何不管 -
tf.getText()+counter
实际上将counter
转换为字符串,然后连接结果。这意味着如果文本是“1”而计数器是“2”,则该值将被转换为“12”,而不是“3”。相反,你应该只柜台转换为String
直接
有很多的方式,你可能会解决这个问题...
- 您可以查看当前的时间对最后一次按键被点击,如果这个值小于3秒,你可以增加计数器,否则你需要重置并重新开始。
- 您可以使用Swing
Timer
,它设置为3秒的非重复延迟。点击按钮后,您将重新启动此计时器并递增counter
。当定时器最终被触发时,你会将counter
重置为0
如果我确实理解了你的话,这应该是你正在寻找的答案。请评论是否有问题!因此,假设我们运行程序6秒,分为2个周期,这些是0 - > 3 - > 6,如果您在0和3之间按住按钮,则jtextfield将更改为单个数字显示,但3秒后会再过3秒实际上开始,所以在你的逻辑之前和之后没有,他们相互抵消,所以如果你不按下按钮,直到6秒1和2将被显示。您可以每3秒钟按3秒按钮,这样只会将显示模式更改为单个值。实际上,显示模式从多个数字变为单个数字,反之亦然,每3秒钟取决于是否按下按钮。如果你想改变多个数字显示从最后一个值开始,我的意思不是从一开始你需要保留最后一个值并从那一点开始显示,所以你可能需要对下面的代码做一些修改。
你的字段应该是这样的
int count=0;
String currenttext = "";
boolean key;
int seconds = 0;
启动按钮操作
private void startbuttonActionPerformed(java.awt.event.ActionEvent evt) {
timer();
threesecondsbutton.setEnabled(true);
}
定时调用方法
public void timer(){
timer.setInitialDelay(3000);
timer.start();
}
超越控制定时器
private Timer timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Single Display
if(key==true)
{
count++;
currenttext = currenttext + Integer.toString(count);
jTextField1.setText(Integer.toString(count));
}
// Multi Display
else
{
count++;
currenttext = currenttext + Integer.toString(count);
jTextField1.setText(currenttext);
}
seconds = seconds + 3;
jLabel3.setText(Integer.toString(seconds));
key = false ;
}
});
按钮3秒钟这个按钮设置键检查按下按钮3秒钟内或3秒后
private void threesecondsbuttonActionPerformed(java.awt.event.ActionEvent evt) {
count++;
currenttext = currenttext + Integer.toString(count);
jTextField1.setText(Integer.toString(count));
key = true;
}
保鲜膜别你的逻辑在一个线程内,每当你按下一个按钮,你就开始一个全新的独立线程 – MadProgrammer 2014-08-29 20:37:30