簡體   English   中英

帶有最大化按鈕的Java模態窗口

[英]Java modal window with maximize button

我怎么能創建一個模態窗口並具有最大化按鈕?
那么是否可以創建一個模態JFrame或創建一個帶有最大化按鈕的JDialog

在大多數外觀和感覺上,模態窗口(例如JDialog )沒有最大化按鈕,因為它們根本不應該被最大化(或最小化)。

使用一些技巧可以添加一個maximise按鈕,但它將完全違背JDialog工作方式。 如果您需要最大化按鈕,最好的解決方案是使用JWindowJFrame而不是JDialog 那些窗口支持最大化和最小化。


警告:無論如何,你都不應該這樣做。

JDialog執行此操作的技巧:

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

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

這是一個替代/稍微更詳細的答案。

試試你是否錯過最大化按鈕? 以前在這里 )。 這是來自現已解散的JRoller網站的Santhosh Kumar Tekturi撰寫的博客文章和代碼的github檔案。

它是一個完整的實用程序類,它使Frame模仿對話框,類似於其他答案。 它涉及向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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM