我正在开发一个项目,根据使用计数器的按钮点击次数插入数字。只涉及一个按钮。按下该按钮一次后,它应在文本字段中输入1。如果在3秒内再次按下该按钮,则应该用2替换1.如果在3秒后按下该按钮,则应以相同的方式输入下一个数字。我在下面添加了我的代码。
我在这个程序上遇到了一些麻烦。当我在3秒内按下按钮两次时,它进入" 12"在JTextField中。在输入一位数字后,我也无法重置计数器。希望您理解我的问题。
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();
}
}
答案 0 :(得分:0)
这是你的问题:
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.setText(tf.getText() + counter);
或者甚至更好,更改此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
等等。
建议不要在swing应用程序中使用thread.sleep()
,我建议使用Swing Timer。
thread.sleep()
会使你的应用程序冻结,而摇摆计时器则不会。
答案 1 :(得分:0)
您当前的方法存在许多问题......
Thread
。每个Thread
等待3秒钟,无论tf.getText()+counter
实际上是在连接结果之前将counter
转换为String。这意味着如果文本是" 1"并且计数器为" 2",该值将转换为" 12"而不是" 3"。相反,您应该直接将计数器转换为String
您可以通过多种方式解决此问题......
Timer
,其设置为3秒的非重复延迟。单击该按钮时,您将重新启动此计时器并递增counter
。最终触发计时器时,您可以将counter
重置为0 答案 2 :(得分:0)
如果我确实理解了你,这应该是你正在寻找的答案。如果出现问题请评论!因此,假设我们运行程序6秒,将其分为2个周期,这些周期为0 - > 3 - > 6,如果你一直按下0到3之间的按钮,jtextfield会变为单号显示,但是3秒后实际开始另外3秒,所以在你的逻辑中没有前后相互取消,所以如果你没有&#39 ; t按下按钮直到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;
}