JAVA按下按钮并等待几秒钟[重复]

Posted

技术标签:

【中文标题】JAVA按下按钮并等待几秒钟[重复]【英文标题】:JAVA press button and wait some seconds [duplicate] 【发布时间】:2016-10-12 22:29:50 【问题描述】:

一个问题:有一个带有单个按钮的简单 GUI 应用程序,当我按下按钮时它应该打印一条消息,2 秒后它应该打印另一条消息,但是当我使用 Thread.sleep(x);它不执行上面的代码并等待,这是代码:

private void button1(java.awt.event.ActionEvent evt)

 System.out.println("lol 1");

 try 
        Thread.sleep(2000);
     catch (InterruptedException ex) 
        System.out.println("error");


System.out.println("lol 2");

但这并不像我想要的那样工作.. 因为它等待 2 秒,然后打印 lol 1 和 lol 2。

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                                          
    // TODO add your handling code here:
    PSCGenerator ps = new PSCGenerator();
    String pin = jTextField1.getText();
    String msg[] = "Cracking the database...\n","Database Cracked succesfully!\n","Running the exploit...\n","Passing '"+pin+"'  to the exploit..\n","New code succesfully spoofed!\n";
    int time[] = 2000,1400,1000,2500;
    int x=0;
    long k=2000;
    jTextArea1.append(msg[x]);
    try 
        Thread.sleep(k);
     catch (InterruptedException ex) 
        Logger.getLogger(PSCGUI.class.getName()).log(Level.SEVERE, null, ex);
    

//creando un sistema che aspetta qualche secondo prima di continuare per la falsa 控制台 System.out.println("大声笑");

【问题讨论】:

我对此表示怀疑。发布一个最小的、完整的程序来重现问题。我的猜测是你并没有真正使用 System.out.println(),而是试图在你的 UI 中显示文本。永远不要使用 sleep() 冻结 UI 线程。使用 javax.swing.Timer。这个问题已经被问了一千次了,但我懒得找到最好的副本。阅读有关并发的摇摆教程。 【参考方案1】:

你可以使用定时器

private void button1(java.awt.event.ActionEvent evt)
    Timer timer = new Timer(ms_you_wanna_wait, new ActionListener() 
      @Override
      public void actionPerformed(ActionEvent arg0) 
        // do your thing here
      
    );
    timer.setRepeats(false); 
    timer.start(); 

[编辑]看你这么麻烦,我这里放了一个小样:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.*;


public class Swing extends JFrame 

    JTextArea area;
    public Swing() 
        initUI();
    

    public final void initUI() 

        JPanel panel = new JPanel();
        getContentPane().add(panel);

        panel.setLayout(null);

        area = new JTextArea();
        area.setBounds(10, 60, 80, 30);
        panel.add(area);

        JButton jButton = new JButton("Click");
        jButton.setBounds(90, 60, 80, 30);
        jButton.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent event) 
                delayedAction();
            
        );

        panel.add(jButton);

        setTitle("Quit button");
        setSize(300, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    

    public static void main(String[] args) 

        Swing ex = new Swing();
            ex.setVisible(true);

    

    public void delayedAction()
        String pin = area.getText();
        String msg[] = "Cracking the database...\n","Database Cracked succesfully!\n","Running the exploit...\n","Passing '"+pin+"'  to the exploit..\n","New code succesfully spoofed!\n";
        int time[] = 2000,1400,1000,2500;
        int x=0;
        long k=2000;

        Timer timer = new Timer(1000, new ActionListener() 
            @Override
            public void actionPerformed(ActionEvent arg0) 
                // TODO add your handling code here:
                //PSCGenerator ps = new PSCGenerator();

                area.append(msg[x]);
            
        );
        timer.setRepeats(false);
        timer.start();
    

【讨论】:

是的,您的计时器工作正常,但我需要更改要显示的消息,但是当我更改它时,会发生很多错误,我无法使用数组来更改消息:如 jTextArea1.append(msg[ x]); 请检查编辑。

以上是关于JAVA按下按钮并等待几秒钟[重复]的主要内容,如果未能解决你的问题,请参考以下文章

重复调用的 WCF 通道生命周期

我如何让java在执行下一行之前等待一秒钟,而不使用try/catch [重复]

在打开该活动窗口的几秒钟内触发按钮按下

在几秒钟后自动更改 jSlider [重复]

每当我按下继续按钮删除任务时,它都会显示以下错误并关闭应用程序[重复]。

如何在不阻止UI的情况下暂停指定时间的Java? [重复]