gpt4 book ai didi

java - 自定义 `JOptionPane.YES_NO_OPTION`

转载 作者:行者123 更新时间:2023-11-30 08:51:50 24 4
gpt4 key购买 nike

开发一个 swing 应用程序,如果用户单击 JoptionPane.showConfirmDialog 上的 No 按钮,我需要将用户重定向到另一个 JFrame。我写了这段代码:

private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
int a=JOptionPane.showConfirmDialog(this, "Did you complete your task?");
JOptionPane.showMessageDialog(null, a);
if(a==1){
RedirectedForm rf=new RedirectedForm();
rf.setVisible(true);
}
}

但是 if(a==1){...} 部分似乎不起作用。即使我创建了对要重定向到的 JFrame-RedirectedForm 的引用,窗口也会始终被处理掉。任何人都可以解释原因并提出解决方案吗?
感谢任何帮助,谢谢!!!

提供以下两个 java 类:

WindowClosing.java

import javax.swing.JOptionPane;

public class WindowClosing extends javax.swing.JFrame {

public WindowClosing() {
initComponents();
}
private void initComponents() {
window_close_label = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});

window_close_label.setText("Window Close Form");
pack();
}

private void formWindowClosing(java.awt.event.WindowEvent evt) {
int a=JOptionPane.showConfirmDialog(this, "Did you complete your task?");
JOptionPane.showMessageDialog(null, a);
if(a==1){
RedirectedForm rf=new RedirectedForm();
rf.setVisible(true);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new WindowClose().setVisible(true);
}
});
}
private javax.swing.JLabel window_close_label;
}

RedirectedForm.java

public class RedirectedForm extends javax.swing.JFrame {
public RedirectedForm() {
initComponents();
}

private void initComponents() {

jLabel1 = new javax.swing.JLabel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jLabel1.setText("You have been redirected to this Form becuse you have closed the previous one");

pack();
}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new RedirectForm().setVisible(true);
}
});
}
private javax.swing.JLabel jLabel1;

我已经重新编辑了代码,希望这能让你更清楚地了解问题

最佳答案

你的主要问题可能是你设置的

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

这会导致整个应用程序在您关闭框架时退出,无论您在对话框中选择了哪个选项。尽管如此,你shouldn't use multiple JFrames , 而不是 use CardLayout如此处所示:

public class Example extends JFrame {

private String redirectedForm = "RedirectedForm";
private String windowClosing = "WindowClosing";

Example() {

CardLayout cl = new CardLayout();
getContentPane().setLayout(cl);
add(new WindowClosing(), windowClosing);
add(new RedirectedForm(), redirectedForm);

addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent evt) {

int a = JOptionPane.showConfirmDialog(Example.this, "Did you complete your task?");
if (a == JOptionPane.CANCEL_OPTION) {
return;
}
if (a == JOptionPane.NO_OPTION) {
// cl.next(frame.getContentPane()); // This to show the next card
cl.show(getContentPane(), redirectedForm); // This is to show a specified card
}
else {
dispose();
}
}
});

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE );
pack();
setLocationRelativeTo(null);
setVisible(true);
}

public static void main(String args[]) {

new Example();
}
}

class WindowClosing extends JPanel {

public WindowClosing() {

JLabel closeLabel = new JLabel("The WindowClosing panel");
add(closeLabel);
}
}

class RedirectedForm extends JPanel {

public RedirectedForm() {

JLabel label = new JLabel("You have been redirected to this Form becuse you have closed the previous one");
add(label);
}
}

通过设置DO_NOTHING_ON_CLOSE windowClosing 事件不会终止程序。相反,您根据所选选项选择做什么:无,退出 ,或切换面板。

注意事项:

  • 不要使用静态常量的 int 值,例如 JOptionPane.NO_OPTION,而是使用对它的引用。
  • 您可能想要为 JOptionPane 设置所有者。

关于java - 自定义 `JOptionPane.YES_NO_OPTION`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30415044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com