簡體   English   中英

Java Swing Main Window 打開對話框時自動來到前面

[英]Java Swing Main Window comes to the front automatically when opening a dialog

我正在嘗試制作一個 Java Swing 應用程序,其中在單擊菜單欄中的 JMenu 時會打開一個 JDialog,但由於某種原因,主 Z97A6D52B9C04A839F278842FB27 會自動打開到前面。

我只是在 JMenu 的 MenuListener 中打開 Dialog。

@Override
public void menuSelected(MenuEvent e) {
    Dialog dialog = new Dialog();
    dialog.setVisible(true);    
}

主要的JFrame從這里開始:

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
            
        @Override
        public void run() {
            Fenster hauptFenster = new Fenster();
            hauptFenster.setVisible(true);
        }
    });
}

我已經嘗試在創建時在 JDialog 上調用toFront() ,但這無濟於事。

這是發生問題的最小可重現示例:

import java.awt.EventQueue;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;

public class Test extends JFrame {
    
    JFrame thisFrame;
    
    public Test() {
        //GUI
        setTitle("Behaviour Test");
        setSize(350,200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        thisFrame = this;
        
        
        //Menübar
        JMenuBar menu = new JMenuBar();
        JMenu widerstand = new JMenu("Start Dialog");
        widerstand.addMenuListener(new MenuListener() {

            @Override
            public void menuSelected(MenuEvent e) {
                TestDialog dialog = new TestDialog(thisFrame);
                dialog.setVisible(true);    
            }
            @Override
            public void menuDeselected(MenuEvent e) {
            }
            @Override
            public void menuCanceled(MenuEvent e) {
            }
            
        });

        menu.add(widerstand);
        setJMenuBar(menu);
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            
            @Override
            public void run() {
                Test testFrame = new Test();
                testFrame.setVisible(true);
            }
        });
    }
}

class TestDialog extends JDialog {

    public TestDialog(JFrame parent) {
        setTitle("Test Dialog");
        setSize(450,300);
        super.setLocationRelativeTo(parent);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setResizable(false);
    }
}


最簡單的解決方案是按照我最初在評論中建議的那樣設置對話框的父級(因為這是保持框架/對話框之間的父/子關系的正常方法)。

但是,即使您不設置父級,我也沒有看到這種行為。 也許那是因為我總是在ActionListener中顯示一個子對話框。

因此,有趣的是,如果您不設置父級, MenuListenerActionListener之間的行為會有所不同。

使用MenuListener時,您需要將代碼包裝在invokeLater()中:

import java.awt.*;
import java.awt.EventQueue;

import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;

public class Test extends JFrame {

    JFrame thisFrame;

    public Test() {
        //GUI
        setTitle("Behaviour Test");
        setSize(350,200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        thisFrame = this;


        JMenuBar menu = new JMenuBar();
        JMenu widerstand = new JMenu("Start Dialog");
        widerstand.addMenuListener(new MenuListener() {

            @Override
            public void menuSelected(MenuEvent e) {

                SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        TestDialog dialog2 = new TestDialog(thisFrame);
                        dialog2.setVisible(true);
                    }
                });
            }
            @Override
            public void menuDeselected(MenuEvent e) {
            }
            @Override
            public void menuCanceled(MenuEvent e) {
            }

        });

        menu.add(widerstand);
        setJMenuBar(menu);

        JButton button = new JButton("Display Dialog");
        add(button);
        button.addActionListener((e) ->
        {
            TestDialog dialog2 = new TestDialog(thisFrame);
            dialog2.setVisible(true);
        });
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Test testFrame = new Test();
                testFrame.setVisible(true);
            }
        });
    }
}

class TestDialog extends JDialog {

    public TestDialog(JFrame parent) {
        setTitle("Test Dialog");
        setSize(450,300);
        setLocationRelativeTo(parent);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setResizable(false);
    }
}

使用ActionListener按預期工作。

暫無
暫無

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

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