user3466314
user3466314

Reputation: 37

How to disable a JButton for certain period of time?

I would like to disable a JButton for about 10 seconds. Is there way to do this?

Thank you

Upvotes: 0

Views: 1812

Answers (4)

Harihar Das
Harihar Das

Reputation: 494

First read the answer from @MadProgrammer and go through the links provided there. If you still need a working example based on those suggestions, following is one.

why the solution is better than few solutions presented

It's because it uses a javax.swing.Timer to enable the button that enables GUI related tasks to be automatically executed on the event-dispatch thread (EDT). This saves the swing application from being intermixed with non EDT operations.

Please try the following example:

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);
            }
        });
    }
}

Upvotes: 1

user251677
user251677

Reputation: 21

you can use Thread.sleep(time in mil seconds)

ex: Thread.sleep(10000); // sleep for 10 seconds

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();
    }
}

but it must be in a separate thread or it will make all the GUI hang for 10 seconds.

you can post more details about the code and i can help

Upvotes: -1

MadProgrammer
MadProgrammer

Reputation: 347184

Use a Swing Timer, when triggered, it notifies the registered listener within the context of the Event Dispatching Thread, making it safe to update the UI from.

See How to use Swing Timers and Concurrency in Swing for more details

Upvotes: 3

Jean-Baptiste Yunès
Jean-Baptiste Yunès

Reputation: 36391

You can use Thread, Task or the simpler Timer class.

Upvotes: 0

Related Questions