在 java 如何显示特定时间的输入对话框消息?
in java how to show input dialog message for specific time?
在我的程序中,我想显示一个输入对话框以获取用户的输入。但如果用户在特定时间内没有给出反馈,输入对话框将关闭,默认设置为运行。
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 WorkerDemo {
public static void main(String[] args) {
JDialog.setDefaultLookAndFeelDecorated(true);
final JOptionPane Message = new JOptionPane("do u want to stop posting?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);
final JDialog getInput = Message.createDialog("Select Yes or No");
final int Option = Message.PROPERTIES;
getInput.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
Message.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) {
Message.setVisible(false);
}
});
t.start();
t.setRepeats(false);
}
});
Message.setVisible(true);
if (Option == JOptionPane.NO_OPTION) {
System.out.println("No button clicked");
} else if (Option == JOptionPane.YES_OPTION) {
System.out.println("Yes button clicked");
} else if (Option == JOptionPane.CLOSED_OPTION) {
System.out.println("JOptionPane closed");}
System.out.println("Outside code.");
}
}
这里的问题是条件不工作。有什么办法可以解决这个问题。提前致谢。
这是您的代码的工作版本:
import javax.swing.*;
public class WorkerDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JDialog.setDefaultLookAndFeelDecorated(true);
JOptionPane optionPane = new JOptionPane("do u want to stop posting?",
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_OPTION);
JDialog dialog = optionPane.createDialog("Select Yes or No");
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
Timer timer = new Timer(5000, e -> dialog.setVisible(false));
timer.setRepeats(false);
timer.start();
dialog.setVisible(true);
if (optionPane.getValue() instanceof Integer) {
int option = (Integer) optionPane.getValue();
if (option == JOptionPane.NO_OPTION) {
System.out.println("No button clicked");
}
else if (option == JOptionPane.YES_OPTION) {
System.out.println("Yes button clicked");
}
}
else {
System.out.println("dialog was closed by timer");
}
System.out.println("Outside code.");
});
}
}
解释和注释:
- 我为您的变量选择了更好的名称,并尊重 Java 命名约定
- 我创建了对话框 visible/invisible,而不是选项面板
- 我用 lambda 表达式替换了内部 类,使代码更短且更易读
- 选项是从 optionPane 的
getValue()
方法中获取的,returns 用户选择了什么。你用常量 Message.PROPERTIES
初始化它的方式没有意义。
- 由于
SwingUtilities.invoeLater()
. ,一切都在事件分派线程中按原样执行
- 计时器只是在使对话框可见之前启动。不需要组件侦听器来执行此操作。
- 无需处理 CLOSED_OPTION,因为您明确告诉选项窗格在关闭时不执行任何操作:此选项是不可能的。
在我的程序中,我想显示一个输入对话框以获取用户的输入。但如果用户在特定时间内没有给出反馈,输入对话框将关闭,默认设置为运行。
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 WorkerDemo {
public static void main(String[] args) {
JDialog.setDefaultLookAndFeelDecorated(true);
final JOptionPane Message = new JOptionPane("do u want to stop posting?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);
final JDialog getInput = Message.createDialog("Select Yes or No");
final int Option = Message.PROPERTIES;
getInput.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
Message.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) {
Message.setVisible(false);
}
});
t.start();
t.setRepeats(false);
}
});
Message.setVisible(true);
if (Option == JOptionPane.NO_OPTION) {
System.out.println("No button clicked");
} else if (Option == JOptionPane.YES_OPTION) {
System.out.println("Yes button clicked");
} else if (Option == JOptionPane.CLOSED_OPTION) {
System.out.println("JOptionPane closed");}
System.out.println("Outside code.");
}
}
这里的问题是条件不工作。有什么办法可以解决这个问题。提前致谢。
这是您的代码的工作版本:
import javax.swing.*;
public class WorkerDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JDialog.setDefaultLookAndFeelDecorated(true);
JOptionPane optionPane = new JOptionPane("do u want to stop posting?",
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_OPTION);
JDialog dialog = optionPane.createDialog("Select Yes or No");
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
Timer timer = new Timer(5000, e -> dialog.setVisible(false));
timer.setRepeats(false);
timer.start();
dialog.setVisible(true);
if (optionPane.getValue() instanceof Integer) {
int option = (Integer) optionPane.getValue();
if (option == JOptionPane.NO_OPTION) {
System.out.println("No button clicked");
}
else if (option == JOptionPane.YES_OPTION) {
System.out.println("Yes button clicked");
}
}
else {
System.out.println("dialog was closed by timer");
}
System.out.println("Outside code.");
});
}
}
解释和注释:
- 我为您的变量选择了更好的名称,并尊重 Java 命名约定
- 我创建了对话框 visible/invisible,而不是选项面板
- 我用 lambda 表达式替换了内部 类,使代码更短且更易读
- 选项是从 optionPane 的
getValue()
方法中获取的,returns 用户选择了什么。你用常量Message.PROPERTIES
初始化它的方式没有意义。 - 由于
SwingUtilities.invoeLater()
. ,一切都在事件分派线程中按原样执行
- 计时器只是在使对话框可见之前启动。不需要组件侦听器来执行此操作。
- 无需处理 CLOSED_OPTION,因为您明确告诉选项窗格在关闭时不执行任何操作:此选项是不可能的。