如何用java制作一个“不要再问我”的对话框弹出框?
How to make a “do not ask me again” dialog pop-up box with java?
在我的程序的一部分中,我使用 JOptionPane
询问用户是否确定他将要做什么。但是我不想让用户每次都这么问,所以我喜欢使用android中一些对话框的功能,但不知道如何实现。在我的程序中,这里有人可以帮助我吗?
(应该有西班牙语 Whosebug)
这是我的代码
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
}
JOptionPane
也允许显示 Component
作为消息。所以这个问题可以这样解决:
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);
基本思想是利用 message
参数实际上可以是 Component
这一事实。然后问题归结为检查用户是否 select 编辑了 "Don't ask me again" 选项,存储并重新使用它
类似...
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;
}
}
作为基本起点。为简单起见,我使用 Properties
作为后备存储,您可以使用数据库或其他持久方法(Preferences
、XML
等)
然后你可以像这样使用它...
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);
如果您在第一次提示时 select "Don't ask me again",则第二次调用将 return 之前 select 编辑的值
现在,在某个地方,您可能希望能够扭转这些决定;)
使用这里的一些答案,我已经设法解决了我的问题,我会在这里分享它以防其他人可能感兴趣:
我有一个复选框仅在当前会话期间有效以重置聊天 window,该复选框在我的应用程序的 "options" 部分可用,单击重置按钮时还会出现另一个复选框。
按钮的 ActionListener 代码如下,包含必要的注释:
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();
}
}
});
}
在我的程序的一部分中,我使用 JOptionPane
询问用户是否确定他将要做什么。但是我不想让用户每次都这么问,所以我喜欢使用android中一些对话框的功能,但不知道如何实现。在我的程序中,这里有人可以帮助我吗?
(应该有西班牙语 Whosebug)
这是我的代码
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
}
JOptionPane
也允许显示 Component
作为消息。所以这个问题可以这样解决:
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);
基本思想是利用 message
参数实际上可以是 Component
这一事实。然后问题归结为检查用户是否 select 编辑了 "Don't ask me again" 选项,存储并重新使用它
类似...
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;
}
}
作为基本起点。为简单起见,我使用 Properties
作为后备存储,您可以使用数据库或其他持久方法(Preferences
、XML
等)
然后你可以像这样使用它...
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);
如果您在第一次提示时 select "Don't ask me again",则第二次调用将 return 之前 select 编辑的值
现在,在某个地方,您可能希望能够扭转这些决定;)
使用这里的一些答案,我已经设法解决了我的问题,我会在这里分享它以防其他人可能感兴趣:
我有一个复选框仅在当前会话期间有效以重置聊天 window,该复选框在我的应用程序的 "options" 部分可用,单击重置按钮时还会出现另一个复选框。
按钮的 ActionListener 代码如下,包含必要的注释:
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();
}
}
});
}