简体   繁体   中英

How to make a “do not ask me again” dialog pop-up box with java?

In one part of my program I use a JOptionPane to ask the user if they are sure of what he will do. But I do not want to bore the user asking that every time you try so I like to use the function of some dialog boxes in android that come with the "Do not ask again", but do not know how to implement that in my program, someone here you could help me? (Should have a Spanish StackOverflow) This is my code

if (jCheckBox2.isSelected() && jCheckBox1.isSelected()){
        JOptionPane.showConfirmDialog(null, "This action can cause problems, want to do it?");
        //here must be something to never ask again this 

    }

The basic idea is to take advantage of the fact the message parameter can actually be a Component . The problem then comes down to checking to see if the user selected the "Don't ask me again" option, storing and re-using it

Something like...

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Properties;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class DontAskMeAgainPanel extends JPanel {

    private JCheckBox dontAskMeAgain;

    public DontAskMeAgainPanel(Object message) {
        setLayout(new BorderLayout());
        if (message instanceof Component) {
            add((Component) message);
        } else if (message != null) {
            add(new JLabel(message.toString()));
        }
        dontAskMeAgain = new JCheckBox("Don't ask me again");
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panel.add(dontAskMeAgain);
        add(panel, BorderLayout.SOUTH);
    }

    public boolean dontAskMeAgain() {
        return dontAskMeAgain.isSelected();
    }

    private static Properties settings;

    protected static void loadProperties() {
        if (settings != null) {
            settings = new Properties();
            File source = new File("...");
            if (source.exists()) {
                try (Reader r = new FileReader(source)) {
                    settings.load(r);
                } catch (IOException exp) {
                    exp.printStackTrace();
                }
            }
        }
    }

    protected static void saveProperties() {
        if (settings != null) {
            settings = new Properties();
            File source = new File("...");
            try (Writer w = new FileWriter(source)) {
                settings.store(w, "Don't prompt for settings");
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }
    }

    public static int showConfirmDialog(Component parent, Object message, String key) {

        loadProperties();

        int result = JOptionPane.NO_OPTION;

        if (settings.containsKey(key + ".prompt") && !Boolean.parseBoolean(settings.getProperty(key + ".value"))) {
            result = Integer.parseInt(settings.getProperty(key + ".value"));
        } else {
            DontAskMeAgainPanel panel = new DontAskMeAgainPanel(message);
            result = JOptionPane.showConfirmDialog(parent, panel);
            if (panel.dontAskMeAgain()) {
                settings.put(key + ".prompt", "false");
                settings.put(key + ".value", Integer.toString(result));

                saveProperties();
            }
        }
        return result;
    }

}

As a basic starting point. I've used Properties as the backing store for simplicity, you could use a database or other persistent method ( Preferences , XML , etc)

Then you could just use it something like...

int result = DontAskMeAgainPanel.showConfirmDialog(null, "This is annoying", "Annoying");
System.out.println("You selected " + result);
result = DontAskMeAgainPanel.showConfirmDialog(null, "This is annoying", "Annoying");
System.out.println("Then you selected " + result);

If you select "Don't ask me again" at the first prompt, then the second call will return the previously selected value

Now, somewhere, you're probably going to want to have the ability to reverse these decisions ;)

JOptionPane also allows displaying Component as message. So this problem can be solved this way:

JPanel msgPanel = new JPanel();

JLabel msg = new JLabel("some message");
msgPanel.add(msg);

JCheckBox jcb = new JCheckBox("do not ask me again");
msgPanel.add(jcb);

JOptionPane.showConfirmDialog(null , msgPanel , "some title" , JOptionPane.OK_CANCEL_OPTION);

Using some of the answers here , I have managed to solve my issue , I'll share it here in case someone else might be interested:

I have a checkbox only valid during current session to reset a chat window, the checkbox is available in "options" part of my application , also another one appears when clicking reset button.

the code for the button's ActionListener is below ,with necessary comments :

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

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

jButtonReset.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //this checkbox is the one available in app settings
                if (!surpassResetConfirmCheckBox.isSelected()) {
                    JPanel msgPanel = new JPanel();

                    // message inside confirmation dialog
                    JLabel msg = new JLabel("Are you sure you wish to clear current conversation?");
                    msgPanel.add(msg);

                    JCheckBox jcb = new JCheckBox("do not ask me again.");
                    jcb.addActionListener(new ActionListener() {

                        @Override
                        public void actionPerformed(ActionEvent arg0) {
                            // if-else statement below is used to update checkbox in settings whenever this one is changed.
                            if (jcb.isSelected()) {
                                surpassResetConfirmCheckBox.setSelected(true);
                            } else {
                                surpassResetConfirmCheckBox.setSelected(false);
                            }

                        }
                    });
                    msgPanel.add(jcb);

                    // JOptionPane returns an integer value ,we'll use it later
                    int result = JOptionPane.showConfirmDialog(null, msgPanel, "Reset Conversation",
                            JOptionPane.OK_CANCEL_OPTION);

                    // check user's response..
                    if (result == JOptionPane.OK_OPTION) {
                        // if user clicked Ok , call your method here
                        // reset();
                    } else if (result == JOptionPane.CANCEL_OPTION || result == JOptionPane.CLOSED_OPTION) {
                        // if user closed the dialog or clicked cancel, uncheck the checkbox in settings 
                        surpassResetConfirmCheckBox.setSelected(false);
                    }
                } else {
                    // if checkbox in settings is checked, call your method immediately 
                    // reset();
                }
            }
        });
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM