Reputation: 73
I want to create a JOptionPane.showConfirmDialog
with a timer. And the default option will be Exit. But if i click on Yes option it should continue the work , and if I click No Option it should exit. If I don't click on any option it should automatically exit from the code.
I tried the below sample code. It is partially working. But the problem is I cannot simulate the Yes/No Option. In any case it is exiting from the code with the YES option.
Although this code is taken from one of the thread, but there the implementation is different. I just modified the code according to my need. Please find the below code:
public class TestProgress {
public static void main(String[] args) {
final JOptionPane msg = new JOptionPane("Database Already Exist. Do you want to continue...?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);
final JDialog dlg = msg.createDialog("Select Yes or No");
final int n = msg.YES_NO_OPTION;
dlg.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(msg.YES_OPTION==n){
System.out.println("Continue the work.. "); // should not exit
}
else if(msg.NO_OPTION==n)
dlg.setVisible(false);
System.exit(1);
}
}).start();
dlg.setVisible(true);
System.out.println("Outside code.");
}
}
What else do I need to do, to make it work correctly?
Upvotes: 3
Views: 7056
Reputation: 21
a completed answer for this question.
public final static boolean showConfirmDialogWithTimeout(Object params, String title, int timeout_ms) {
final JOptionPane msg = new JOptionPane(params, JOptionPane.WARNING_MESSAGE, JOptionPane.CANCEL_OPTION);
final JDialog dlg = msg.createDialog(title);
msg.setInitialSelectionValue(JOptionPane.OK_OPTION);
dlg.setAlwaysOnTop(true);
dlg.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dlg.addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
super.componentShown(e);
final Timer t = new Timer(timeout_ms, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dlg.setVisible(false);
}
});
t.start();
}
});
dlg.setVisible(true);
Object selectedvalue = msg.getValue();
if (selectedvalue.equals(JOptionPane.CANCEL_OPTION)) {
return false;
} else {
return true;
}
}
// example usage
String message = "The earth will explode in 10 seconds. Select CANCEL if you won't.";
JLabel lbmsg = new JLabel(message);
boolean result = showConfirmDialogWithTimeout(lbmsg, "Shutdown Warning", 10 * 1000);
if (result == false) {
Utils.showMessage(message + " cancel is selected");
}
else {
Utils.showMessage(message + " timeout or okay is selected");
}
Upvotes: 1
Reputation: 57421
The autoclosing dialog of JOptionPane
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
public class TestProgress {
public static void main(String[] args) {
final JOptionPane msg = new JOptionPane("Database Already Exist. Do you want to continue...?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);
final JDialog dlg = msg.createDialog("Select Yes or No");
dlg.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dlg.addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
super.componentShown(e);
final Timer t = new Timer(5000,new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dlg.setVisible(false);
}
});
t.start();
}
});
dlg.setVisible(true);
System.out.println("Outside code.");
}
}
UPDATE:
Use extended constructor where you can pass initial option and specify NO
as default
JOptionPane(Object message, int messageType, int optionType,
Icon icon, Object[] options, Object initialValue)
Upvotes: 2