带有最大化按钮的Java模式窗口

带有最大化按钮的Java模式窗口,java,modal-dialog,Java,Modal Dialog,如何创建一个具有最大化按钮的模态窗口? 那么,是否可以创建一个模式JFrame或创建一个带有最大化按钮的JDialog?在大多数外观上,模式窗口(如JDialog)没有最大化按钮,只是因为它们根本不应该被最大化(或最小化) 通过一些技巧可以添加最大化按钮,但这完全违背了JDialog的工作方式。 如果需要最大化按钮,最好的解决方案是使用JWindow或JFrame而不是JDialog。这些窗口支持最大化和最小化 警告:无论如何,你都不应该那样做 在JDialog中执行此操作的技巧: setUn

如何创建一个具有最大化按钮的模态窗口?

那么,是否可以创建一个模式
JFrame
或创建一个带有最大化按钮的
JDialog

在大多数外观上,模式窗口(如
JDialog
)没有最大化按钮,只是因为它们根本不应该被最大化(或最小化)

通过一些技巧可以添加
最大化
按钮,但这完全违背了
JDialog
的工作方式。 如果需要最大化按钮,最好的解决方案是使用
JWindow
JFrame
而不是
JDialog
。这些窗口支持最大化和最小化


警告:无论如何,你都不应该那样做

JDialog
中执行此操作的技巧:

setUndecorated(true);
getRootPane().setWindowDecorationStyle(JRootPane.FRAME);

下面是一个更详细的备选答案

试试看()。这是由Santhosh Kumar Tekturi从现在已不存在的JRoller站点撰写的博客文章和代码的github存档

它是一个完整的实用程序类,使框架模拟对话框,类似于其他答案。它涉及到在框架中添加一个
WindowListener
,以使框架位于其所有者之上并使其所有者框架处于禁用状态(警告:在
windowClosed
方法中,它可能应该是
Frame.removeWindowListener(此);
,并将
WindowListener
发送给所有者,以将框架保持在其上方并删除侦听器。它还使用自己的
事件队列
来处理事件。请注意,这是一篇旧文章,因此如代码中所述,可能会有更新的API更好地处理此代码

这是核心功能。其余部分请参见链接。注意:存储库中的代码与本文不同;我相信存储库更发达

// show the given frame as modal to the specified owner.
// NOTE: this method returns only after the modal frame is closed.
public static void showAsModal(final Frame frame, final Frame owner){
    frame.addWindowListener(new WindowAdapter(){
        public void windowOpened(WindowEvent e){
            owner.setEnabled(false);
        }

        public void windowClosing(WindowEvent e) {
            owner.setEnabled(true);
        }

        public void windowClosed(WindowEvent e){
            frame.removeWindowListener(this); // originally called on owner
        }
    });

    owner.addWindowListener(new WindowAdapter(){
        public void windowActivated(WindowEvent e){
            if(frame.isShowing()){
                frame.setExtendedState(JFrame.NORMAL);
                frame.toFront();
            }else
                owner.removeWindowListener(this);
        }
    });

    owner.toFront();
    frame.setVisible(true);
    try{
        new EventPump(frame).start();
    } catch(Throwable throwable){
        throw new RuntimeException(throwable);
    }
}

解决方案1:在Windows上测试

我使用JFrame作为模式窗口

JFrame mainWindow = new JFrame;
mainWindow.setVisible(true);
JFrame modalWindow = new JFrame();
// The next two sentences gives modalWindow modal beahaviour
mainWindow.setEnabled(false);
mainWindow.setFocusable(false);
modalWindow.setVisible(true);
解决方案2:在Ubuntu上测试

我添加了一个WindowFocusListener

addWindowFocusListener(new java.awt.event.WindowFocusListener() {
    public void windowGainedFocus(java.awt.event.WindowEvent evt) {}
    public void windowLostFocus(java.awt.event.WindowEvent evt) {
        formWindowLostFocus(evt);}

private void formWindowLostFocus(java.awt.event.WindowEvent evt) {
    this.requestFocus();
    this.toFront();}

所以没有任何“合法”的方法来做这件事S@János Harsányi,不,正如我所说,他们不应该有一个最大化按钮。正如我所说,我不建议在任何情况下使用它。使用它到底有什么危险?解决方案2是“超级模式”,无法选择其他窗口,无论是Java、本机还是其他任何窗口。小心!@KarlRichter感谢您让我知道,我已更新了链接并添加了更多详细信息,包括最相关的代码。