如何在一段时间内禁用JButton?

时间:2014-11-01 08:13:35

标签: java swing jbutton

我想禁用JButton约10秒钟。有没有办法做到这一点?

谢谢

4 个答案:

答案 0 :(得分:3)

使用Swing Timer,在触发时,它会在事件调度线程的上下文中通知已注册的侦听器,从而可以安全地更新UI。

有关详细信息,请参阅How to use Swing TimersConcurrency in Swing

答案 1 :(得分:1)

首先阅读@MadProgrammer的答案并浏览其中提供的链接。如果您仍需要基于这些建议的工作示例,则以下是一个。

为什么解决方案优于提供的解决方案

因为它使用javax.swing.Timer来启用按钮,该按钮可以在事件派发线程(EDT)上自动执行GUI相关任务。这样可以避免摆动应用与非EDT操作混合。

请尝试以下示例:

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

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class SwingDemo extends JPanel {
    private final JButton button;
    private final Timer stopwatch;
    private final int SEC = 10;

    public SwingDemo() {
        button = new JButton("Click me to disable for " + SEC + " secs");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton toDisable = (JButton) e.getSource();
                toDisable.setEnabled(false);
                stopwatch.start();
            }
        });
        add(button);
        stopwatch = new Timer(SEC * 1000, new MyTimerListener(button));
        stopwatch.setRepeats(false);
    }

    static class MyTimerListener implements ActionListener {
        JComponent target;

        public MyTimerListener(JComponent target) {
            this.target = target;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            target.setEnabled(true);
        }

    }

    public static void main(String[] args) {
        final JFrame myApp = new JFrame();
        myApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myApp.setContentPane(new SwingDemo());
        myApp.pack();
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                myApp.setVisible(true);
            }
        });
    }
}

答案 2 :(得分:0)

您可以使用ThreadTask或更简单的Timer类。

答案 3 :(得分:-1)

你可以使用Thread.sleep(以毫秒为单位的时间)

例如: 了Thread.sleep(10000); //睡10秒

JButton button = new JButton("Test");

    try {
        button.setEnabled(false);
        Thread.sleep(10000);
        button.setEnabled(true);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

但它必须在一个单独的线程中,否则会使所有GUI挂起10秒钟。

您可以发布有关代码的更多详细信息,我可以提供帮助