我有一个未修饰的模态jdialog,当用户在模态对话框外单击时,我想将其设置为可见(false)。这在秋千上可能吗?我要做的是弹出一个文本字段的自定义编辑器,比如日期选择器。有没有更简单的方法来做我想做的事?编辑记住,model会阻塞对setvisible的调用(true),所以不能只说“不要使用模态对话框”我试着把听众的注意力集中在对话上,当对话是模态的时候他们不会触发。
koaltpgm1#
尝试将模式设置为false,然后使用windowsdactivated()关闭de dialog(dialog.dispose()),这对我很有用。
3mpgtkmj2#
如果你可以在对话框外单击,然后“发生了什么”,那么它就不是一个模态对话框。所有答案都是正确的,您应该创建一个非模态对话框,然后通过focuslistener处理您的用例。
7gcisfzg3#
不是一个真正的模态对话框,那么如果点击其他地方关闭它,也许你想要 setAlwaysOnTop 但是,下面这样的方法应该可以做到(未经测试)。注意,我建议将代码移到比所提供的更好的设计中。
setAlwaysOnTop
static JDialog dialog = ... Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { public void eventDispatched(AWTEvent e) { dialog.setVisible(false); SwingUtils.invokeLater(new Runnable(){ public void run(){ Toolkit.getDefaultToolkit().removeAWTEventListener(this); } }); } }, AWTEvent.MOUSE_EVENT_MASK); dialog.setVisible(true);
fslejnso4#
edit:changed to 使用windowfocuslistener而不是focuslistener,并检查焦点丢失时的降序组件,以避免隐藏子组件是否获得焦点。一个简单的方法是在对话框上添加一个窗口焦点侦听器,当焦点丢失时隐藏它。我不认为在这种情况下需要情态。例如:
import javax.swing.*; import java.awt.*; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class ClickAwayDialog extends JDialog { public ClickAwayDialog(final Frame owner) { super(owner); JPanel pnl = new JPanel(new BorderLayout()); pnl.add(new JLabel("Click outside this dialog in the parent frame to close it"), BorderLayout.NORTH); JButton btn = new JButton("Click Me"); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(ClickAwayDialog.this, "New Child Window"); } }); pnl.add(btn, BorderLayout.CENTER); this.setContentPane(pnl); this.pack(); this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.setLocationRelativeTo(owner); this.setAlwaysOnTop(true); this.addWindowFocusListener(new WindowFocusListener() { public void windowGainedFocus(WindowEvent e) { //do nothing } public void windowLostFocus(WindowEvent e) { if (SwingUtilities.isDescendingFrom(e.getOppositeWindow(), ClickAwayDialog.this)) { return; } ClickAwayDialog.this.setVisible(false); } }); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame parent = new JFrame(); parent.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); parent.setSize(300, 300); parent.setLocationByPlatform(true); parent.setVisible(true); ClickAwayDialog dlg = new ClickAwayDialog(parent); dlg.setVisible(true); } }); } }
62lalag45#
它不必是一个模态对话框(模态意味着它阻止您使用所有者窗口,直到您隐藏对话框)。最好试试这个:
final JDialog dlg ... dlg.setModal(false); dlg.addWindowFocusListener(new WindowFocusListener() { public void windowLostFocus(WindowEvent e) { dlg.setVisible(false); } public void windowGainedFocus(WindowEvent e) { } });
bmvo0sr56#
可能会添加一个focuslistener并在失去焦点时隐藏对话框。如果对话框中的某些元素具有焦点,则可能会很棘手。不管怎样,试试看。
vxbzzdmp7#
使用windowlistener并处理windowdeactivated()事件。
7条答案
按热度按时间koaltpgm1#
尝试将模式设置为false,然后使用windowsdactivated()关闭de dialog(dialog.dispose()),这对我很有用。
3mpgtkmj2#
如果你可以在对话框外单击,然后“发生了什么”,那么它就不是一个模态对话框。所有答案都是正确的,您应该创建一个非模态对话框,然后通过focuslistener处理您的用例。
7gcisfzg3#
不是一个真正的模态对话框,那么如果点击其他地方关闭它,也许你想要
setAlwaysOnTop
但是,下面这样的方法应该可以做到(未经测试)。注意,我建议将代码移到比所提供的更好的设计中。fslejnso4#
edit:changed to 使用windowfocuslistener而不是focuslistener,并检查焦点丢失时的降序组件,以避免隐藏子组件是否获得焦点。
一个简单的方法是在对话框上添加一个窗口焦点侦听器,当焦点丢失时隐藏它。我不认为在这种情况下需要情态。例如:
62lalag45#
它不必是一个模态对话框(模态意味着它阻止您使用所有者窗口,直到您隐藏对话框)。最好试试这个:
bmvo0sr56#
可能会添加一个focuslistener并在失去焦点时隐藏对话框。如果对话框中的某些元素具有焦点,则可能会很棘手。不管怎样,试试看。
vxbzzdmp7#
使用windowlistener并处理windowdeactivated()事件。