继承Java 的JDialog创建了一个ConfirmDialog类,然后分别根据ConfirmDialog newc出了两个对象confirmDialog1和confirmDialog2,在这两个confirmDialog上都有Yes & No 两个button。操作是先弹出confirmDialog1,在confirmDialog1弹出后再去弹confirmDialog2,当confirmDialog2弹出后立马点击confirmDialog2的Yes button,confirmDialog2执行了Yes的逻辑,但是confirmDialog1也执行了Yes的逻辑,这是为什么
时间: 2023-08-19 08:04:16 浏览: 49
这是因为在创建ConfirmDialog类时,可能未正确处理各个对话框实例之间的逻辑独立性。确认对话框的逻辑应该是针对特定实例进行处理,而不是全局共享。
确认对话框的行为应该是独立的,每个对话框实例都有自己的状态和处理逻辑。如果在创建ConfirmDialog类时没有正确处理这一点,可能会导致一个对话框的操作影响到其他对话框的行为。
要解决这个问题,你可以检查ConfirmDialog类的代码,确保在每个对话框实例中都设置了独立的逻辑和状态。你可以使用实例变量来存储每个对话框的状态,并在每个对话框实例中处理按钮点击事件。
另外,你还可以考虑使用回调函数来处理对话框的逻辑。当用户点击确认对话框的按钮时,可以调用回调函数来执行特定的逻辑操作,而不是在对话框类内部直接执行逻辑。这样可以更好地控制每个对话框实例的行为。
相关问题
继承于Java JDialog而创建的ConfrimDialog类,分别基于这个类new出两个confirmDialog,都带有Yes & No两个button,然后先弹出一个confirmDialog1,紧接着再弹出confirmDialog2,并且在confirmDialog2弹出时立马点击confirmDialog2的Yes Button,confirmDialog2 的Yes逻辑响应了,但是confirmDialog1的Yes逻辑也响应了这是为什么
这个问题可能是因为你的确认对话框(confirm dialog)共享了同一个事件分发线程(Event Dispatch Thread,EDT)。在Java中,所有的Swing组件事件都是在EDT上处理的,包括按钮点击事件。当你点击confirmDialog2的Yes按钮时,EDT会处理该事件并执行相应的逻辑。然而,由于confirmDialog1和confirmDialog2共享同一个EDT,因此EDT也会同时处理confirmDialog1上的点击事件。
为了解决这个问题,你可以为每个确认对话框创建独立的EDT。这样,当你点击confirmDialog2的Yes按钮时,只有与confirmDialog2关联的EDT会处理该事件,而不会影响confirmDialog1。
下面是一个示例代码,演示如何为每个确认对话框创建独立的EDT:
```java
import javax.swing.*;
public class CustomConfirmDialog extends JDialog {
public CustomConfirmDialog(JFrame parent, String title) {
super(parent, title, true); // 使用 true 创建模态对话框
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setSize(300, 200);
setLocationRelativeTo(parent);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
CustomConfirmDialog dialog1 = new CustomConfirmDialog(frame, "Confirm Dialog 1");
JButton yesButton1 = new JButton("Yes");
JButton noButton1 = new JButton("No");
dialog1.add(yesButton1);
dialog1.add(noButton1);
CustomConfirmDialog dialog2 = new CustomConfirmDialog(frame, "Confirm Dialog 2");
JButton yesButton2 = new JButton("Yes");
JButton noButton2 = new JButton("No");
dialog2.add(yesButton2);
dialog2.add(noButton2);
yesButton1.addActionListener(e -> {
System.out.println("Confirm Dialog 1 - Yes");
dialog1.dispose();
});
noButton1.addActionListener(e -> {
System.out.println("Confirm Dialog 1 - No");
dialog1.dispose();
});
yesButton2.addActionListener(e -> {
System.out.println("Confirm Dialog 2 - Yes");
dialog2.dispose();
});
noButton2.addActionListener(e -> {
System.out.println("Confirm Dialog 2 - No");
dialog2.dispose();
});
dialog1.setVisible(true);
dialog2.setVisible(true);
});
}
}
```
在这个示例中,我们创建了两个独立的确认对话框(dialog1和dialog2),并为每个对话框设置了独立的按钮点击事件处理逻辑。当你点击confirmDialog2的Yes按钮时,只有与confirmDialog2关联的EDT会处理该事件,而confirmDialog1不会受到影响。
希望这个示例能够解决你的问题!如果还有其他问题,请随时提问。
同时new两个相同类型的JDialog对象,并且同时弹出,怎么能做到相互不影响
要实现同时弹出两个相同类型的JDialog对象,并且相互不影响,可以为每个JDialog对象创建一个独立的Event Dispatch Thread (EDT)。EDT是用于处理Swing组件事件的线程,通过为每个JDialog对象创建一个独立的EDT,可以确保它们在不互相阻塞的情况下同时弹出。
下面是一个示例代码,演示如何同时弹出两个相同类型的JDialog对象,并且相互不影响:
```java
import javax.swing.*;
public class IndependentDialogs {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
createAndShowDialog("Dialog 1");
createAndShowDialog("Dialog 2");
});
}
private static void createAndShowDialog(String title) {
JDialog dialog = new JDialog();
dialog.setTitle(title);
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
dialog.setSize(300, 200);
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
}
```
在这个示例中,我们使用SwingUtilities.invokeLater()方法确保在EDT上创建和显示对话框。通过在不同的EDT上创建和显示两个对话框,它们就能够同时弹出,并且相互之间不会产生影响。
希望这个示例对你有所帮助!如果还有其他问题,请随时提问。