在我的项目代码中,我们使用自定义对话框。我正面临一些奇怪的问题。
我有一个孩子对话和一个家长对话。
理想情况下,当我们调用 parent.setVisible(false)
时,儿童对话会进入隐身状态。
但我看到一些奇怪的行为。
当我parent.setVisible(false)
时,我的孩子对话框仍然可见但是当我试图获得child.isVisible()
时:它给了我错误。
此外,当我尝试调用child.setVisible(false)
时,它再次对父对话框的可见性没有影响。
注意:由于太多的复杂性,长度和其他外部API问题,我无法显示任何代码示例。此外,我尝试使用外部程序复制它,但它按预期工作,没有看到任何问题。
我只是想知道有人知道在我们制作parent.setVisible(false)
时儿童对话框控件放松的任何情况吗?
答案 0 :(得分:1)
我只想知道是否有人知道孩子的任何情况 当我们创建parent.setVisible(false)?
时,对话框控件会松开
对于parent也称为setVisible(false),
请确保您重复使用减少数量的子项,将DefaultCloseOparation设置为HIDE或DISPOSE_ON_CLOSE(通过defasult将最后一个容器关闭,但如果容器之间存在模态则无效)
例如
import java.awt.BorderLayout;
import java.awt.Dialog.ModalityType;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
/**
*
* @author user
*/
public class ModalityAndJDialog {
private JFrame frame = new JFrame();
private JDialog dialog1;
private JDialog dialog2;
private JButton button = new JButton("Start Swing Timer");
private JButton button1 = new JButton();
private JButton button01 = new JButton();
private JButton button02 = new JButton();
private Timer timer;
public ModalityAndJDialog() {
button.setAction(updateCol());
frame.setTitle("JFrame");
frame.add(button, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setSize(400, 300);
frame.setLocation(150, 150);
frame.setVisible(true);
timer = new javax.swing.Timer(500, updateCol());
timer.setRepeats(false);
timer.start();
}
private Action updateCol() {
return new AbstractAction("Show JDialog") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
if (dialog1 == null) {
dialog1 = new JDialog(dialog1, ModalityType.APPLICATION_MODAL);
dialog1.setTitle("1st. JDialog");
dialog1.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
button1.setAction(updateCol1());
button01.setAction(updateCol01());
dialog1.add(button1, BorderLayout.SOUTH);
dialog1.add(button01, BorderLayout.NORTH);
dialog1.pack();
dialog1.setSize(400, 300);
dialog1.setLocation(250, 250);
dialog1.setVisible(true);
} else {
EventQueue.invokeLater(() -> {
dialog1.setVisible(true);
});
}
}
};
}
private Action updateCol01() {
return new AbstractAction("Hide JDialog") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
if (dialog1 != null) {
dialog1.setVisible(false);
}
}
};
}
private Action updateCol1() {
return new AbstractAction("Show Child JDialog") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
if (dialog2 == null) {
dialog1.setTitle("2nd. JDialog");
dialog2 = new JDialog(frame, ModalityType.APPLICATION_MODAL);
dialog2.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
button02.setAction(updateCol02());
dialog2.add(button02, BorderLayout.SOUTH);
dialog2.pack();
dialog2.setSize(400, 300);
dialog2.setLocation(350, 350);
dialog2.setVisible(true);
} else {
EventQueue.invokeLater(() -> {
dialog2.setVisible(true);
if (!frame.isVisible()) {
frame.setVisible(true);
}
});
}
}
};
}
private Action updateCol02() {
return new AbstractAction("Hide JDialog") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
if (frame != null) {
frame.setVisible(false);
}
/*if (dialog1 != null) {
dialog1.setVisible(false);
}*/
}
};
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
/*UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());*/
} catch (UnsupportedLookAndFeelException | ClassNotFoundException | IllegalAccessException | InstantiationException ex) {
System.out.println("[L&F][Exception] " + ex.getMessage());
}
EventQueue.invokeLater(() -> {
new ModalityAndJDialog();
});
}
}