让我们说,我们有几个JFrame
窗口同时可见,并且每个窗口JDialog
都会出现。当我们的窗口处于级联模式且对话框setAlwaysOnTop
为true
时,所有对话框都将在最后一个窗口中显示。
我只想将Dialog组件与其所有者关联起来,这样当你在Frames之间切换时,你只会在顶部获得一个对话框,并且在单击一个框架时不会丢失该对话框。
对话框有这样的构造函数:
setAlwaysOnTop(true);
setModal(false);
提前致谢!
答案 0 :(得分:5)
How to make JDialog onTop only for his parent?
必须使用setModalityType
f.e. ModalityType.DOCUMENT_MODAL
ModalityType.APPLICATION_MODAL
代替setModal
setModal
对intialized
/ is parent for
此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);
}
}
}
答案 1 :(得分:1)
JDialog
JDialog(Dialog owner, boolean modal)
构造函数中的API是setModal()
,这意味着您可以创建一个对话框并指定父容器和模态。在模态部分中,将其设置为true意味着此对话框将是模态的,并且在显示对话框时无法访问父窗口。
但同样,您可以使用{{1}}方法来完成相同的工作。
答案 2 :(得分:0)
只需将Model
设置为true,然后设置Relativelocation(parent);
,不要将setontop(true)
用于JDialog。
然后如果你回来打开那个时候你每次都会得到对话。但是当你拖动父框架时,这将有所不同。
答案 3 :(得分:0)
我设法解决了这个问题,构建了一个完成这项工作的焦点监听器。然后,您可以将此侦听器设置为您希望对话框始终可见的窗口,直到关闭为止。这对我有用:
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();
}
}