temel fikir aslında bir Component
olabilir aslında message
parametresini istifade etmektir. O zaman sorun temel başlangıç olarak
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;
}
}
... depolanması ve ona
şey gibi yeniden kullanarak, kullanıcı "Yeniden sorma" seçeneğini seçili olmadığını görmek için kontrol iner puan. Kullandığım Properties
basitlik için destek deposu olarak, bir veritabanı veya diğer kalıcı yöntem (Preferences
, XML
, vs)
Sonra tıpkı o şey kullanabilirsiniz kullanabilirsiniz ...
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);
İlk komutta "Beni bir daha sorma" yı seçerseniz, ikinci arama daha önce seçilen
değerini döndürür. Şimdi, bir yerlerde, bu kararları tersine çevirme yeteneğine sahip olmak isteyeceksiniz;
Neden iletişim gösterilmiştir belirtmek için bir bayrak (boolean) kullanmıyorsun? Gösterildikten sonra bayrağı doğru olarak ayarlayın ve gösterilmeden önce bayrağı kontrol edin. – Gosu
Evet, ama bununla ilgili problem, programı kapattığımda, tekrar açıldıktan sonra tekrar aynı şeyi soracağım. Bu yüzden sadece 1 kez –
sormak istiyorum O zaman bu ayarı kaydetmeniz ve programın bu cevap için ayrıştırılacağı bir dosyaya yazmanız gerekir. En azından bu bir kez sormak ve bir daha asla istemiyorsanız en belirgin cevap gibi görünüyor. – Ungeheuer