Die Grundidee sich die Tatsache zunutze, die message
Parameter zu nehmen ist, kann tatsächlich ein Component
sein. Das Problem kommt dann nach unten zu überprüfen, ob der Benutzer der gewählten Option „Mich nicht mehr fragen“, Speicher und Wiederverwenden es
So etwas wie ...
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;
}
}
Als grundlegender Ausgang Punkt. Ich habe verwendet Properties
als Zusatzspeicher für Einfachheit, eine Datenbank oder andere persistente Methode verwenden könnte (Preferences
, XML
usw.)
Dann könnten Sie es einfach verwenden, so etwas wie ...
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);
Wenn Sie an der ersten Eingabeaufforderung "Nicht mehr nachfragen" auswählen, gibt der zweite Anruf den zuvor ausgewählten Wert zurück
Jetzt werden Sie wahrscheinlich die Möglichkeit haben, diese Entscheidungen rückgängig zu machen;)
Warum Sie nicht über einen Flag (boolean), um anzuzeigen, verwenden, ob der Dialog angezeigt wurde? Setzen Sie das Flag nach der Anzeige auf true und überprüfen Sie das Flag, bevor es angezeigt wird? – Gosu
Ja, ich denke daran, aber das Problem damit ist, wenn ich das Programm schließe, nach dem erneuten Öffnen wird es wieder dasselbe fragen. Also ich möchte nur 1 Mal fragen –
Dann müssten Sie diese Einstellung speichern und es in eine Datei schreiben, die das Programm für diese Antwort analysieren würde. Zumindest scheint das die naheliegendste Antwort zu sein, wenn man einmal und nie wieder fragen möchte. – Ungeheuer