可以说,我们有几个JFrame
窗口同时可见,并且每个窗口都会JDialog
出现。当我们的窗口处于级联模式和对话框setAlwaysOnTop
时,true
所有对话框都将在最后一个窗口中可见。
我只想将 Dialog 组件与其所有者相关联,这样当您在 Frames 之间切换时,您只会在顶部看到一个对话框,并且在单击框架时不会丢失此对话框。
对话框有这样的构造函数:
setAlwaysOnTop(true);
setModal(false);
提前致谢!
可以说,我们有几个JFrame
窗口同时可见,并且每个窗口都会JDialog
出现。当我们的窗口处于级联模式和对话框setAlwaysOnTop
时,true
所有对话框都将在最后一个窗口中可见。
我只想将 Dialog 组件与其所有者相关联,这样当您在 Frames 之间切换时,您只会在顶部看到一个对话框,并且在单击框架时不会丢失此对话框。
对话框有这样的构造函数:
setAlwaysOnTop(true);
setModal(false);
提前致谢!
How to make JDialog onTop only for his parent?
必须使用 setModalityType
feModalityType.DOCUMENT_MODAL
ModalityType.APPLICATION_MODAL
而不是setModal
setModal
intialized
对/ is parent for
this的容器有效JDialog
不要使用多个JFrame
,JDialog
而是使用,将此容器重用于另一个操作
例如
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SuperConstructor extends JFrame {
private static final long serialVersionUID = 1L;
public SuperConstructor() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(300, 300));
setTitle("Super constructor");
Container cp = getContentPane();
JButton b = new JButton("Show dialog");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
FirstDialog firstDialog = new FirstDialog(SuperConstructor.this);
}
});
cp.add(b, BorderLayout.SOUTH);
JButton bClose = new JButton("Close");
bClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
System.exit(0);
}
});
add(bClose, BorderLayout.NORTH);
pack();
setVisible(true);
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
SuperConstructor superConstructor = new SuperConstructor();
}
});
}
private class FirstDialog extends JDialog {
private static final long serialVersionUID = 1L;
FirstDialog(final Frame parent) {
super(parent, "FirstDialog");
setPreferredSize(new Dimension(200, 200));
setLocationRelativeTo(parent);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
JButton bNext = new JButton("Show next dialog");
bNext.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
SecondDialog secondDialog = new SecondDialog(parent, false);
}
});
add(bNext, BorderLayout.NORTH);
JButton bClose = new JButton("Close");
bClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
setVisible(false);
}
});
add(bClose, BorderLayout.SOUTH);
pack();
setVisible(true);
}
}
private int i;
private class SecondDialog extends JDialog {
private static final long serialVersionUID = 1L;
SecondDialog(final Frame parent, boolean modal) {
//super(parent); // Makes this dialog unfocusable as long as FirstDialog is visible
setPreferredSize(new Dimension(200, 200));
setLocation(300, 50);
setModal(modal);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setTitle("SecondDialog " + (i++));
setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
JButton bClose = new JButton("Close");
bClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
setVisible(false);
}
});
add(bClose, BorderLayout.SOUTH);
pack();
setVisible(true);
}
}
}
在APIJDialog
中,构造函数之一JDialog(Dialog owner, boolean modal)
意味着您可以创建一个对话框并指定父容器以及模态。在 modal 部分,将其设置为 true 意味着此对话框将是模态的,并且在显示对话框时您无法访问父窗口。
但同样,您可以使用该setModal()
方法来完成相同的操作。
我设法解决了这个问题,构建了一个可以完成这项工作的焦点侦听器。然后,您可以将此侦听器设置为您希望对话框在关闭之前始终可见的窗口。这对我有用:
public class WindowFocusListenerDialogFocus implements WindowFocusListener {
private JFrame _dialogFrame;
public WindowFocusListenerDialogFocus(JFrame dialogFrame) {
_dialogFrame = dialogFrame;
}
@Override
public void windowLostFocus(WindowEvent e) {
System.out.println("Focus lost!");
}
@Override
public void windowGainedFocus(WindowEvent e) {
System.out.println("Focus gained!");
_dialogFrame.toFront();
}
}
只需设置Model
true 和 Just 设置Relativelocation(parent);
,不要setontop(true)
用于 JDialog。
然后如果你重新打开那个时间,你每次都会得到对话框。但是当你拖动父框架时会有所不同。