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

时间:2010-10-09 21:24:47

标签: java modal-dialog

我怎样才能创建一个模态窗口并具有最大化按钮? 那么是否可以使用最大化按钮创建模态JFrame或创建JDialog

3 个答案:

答案 0 :(得分:11)

在大多数外观和感觉上,模态窗口(例如JDialog)没有最大化按钮,因为它们根本不应该最大化(或最小化)。

可以通过一些技巧添加maximise按钮,但它将完全违反JDialog应该工作的方式。 如果您需要最大化按钮,最佳解决方案是使用JWindowJFrame而不是JDialog。那些窗口支持最大化和最小化。


警告:无论如何都不应该这样做。

JDialog中执行此操作的技巧:

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

答案 1 :(得分:2)

解决方案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();}

答案 2 :(得分:0)

这是一个备用/稍微详细的答案。

尝试Are You Missing Maximize Button?formerly here)。这是来自现已解散的JRoller网站的Santhosh Kumar Tekturi的博客文章和代码的github档案。

这是一个完整的实用程序类,它使Frame模仿对话框,类似于其他答案。它涉及向框架添加WindowListener以使框架保持在其所有者的顶部并保持其所有者框架被禁用(警告:在windowClosed方法中它应该是frame.removeWindowListener(this);,并且WindowListener向所有者保留框架并删除侦听器。它还使用自己的EventQueue来处理事件。注意这是一个旧帖子,所以在代码中提到可能是更新的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);
    }
}