Java 已经在 Main window 的内容窗格中打开 windows 当在主 window 上单击菜单项时,window 位于主 window 下方

Java Already opened windows inside the Content pane of Main window goes beneath the main window when a menu item is clicked on the main window

我是 java 挥杆初学者,这是我的第一个问题。在问这个问题之前,我已经搜索了很长时间,但没有找到任何解决方案。

我有一个带有 JmenuBar 和 MenuItems 的主 window。我的问题是,当我单击菜单项时,已经打开的 window 位于主窗口 Window 下方,而新的 window 弹出窗口位于主窗口顶部。

我的要求

  1. 当我点击一个菜单项时,打开的新 window 应该在之前打开的 window 的顶部并且 windows 应该在主 [=38] 之上=].
  2. 当我再次点击这个位置的菜单时,下拉菜单项应该覆盖所有 windows。

我试过setAlwaysOnTop(true);到所有菜单项 windows。但它不符合我的要求 (2.)

请帮帮我

这是我的主要代码 window

public class Main extends JFrame {
    private JPanel contentPane;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main frame = new Main();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public Main() {
        setTitle("Menu");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(500, 500, 400, 425);
        setLocationRelativeTo(null);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(null);
        
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        
        JMenu mnPurchase = new JMenu("Purchase");
        menuBar.add(mnPurchase);
        
        JMenuItem mntmAddPurchaseInvoice = new JMenuItem("Purchase Invoice");
        mntmAddPurchaseInvoice.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Purchase frame = new Purchase();
                frame.setVisible(true);
                
                }
            });
        mnPurchase.add(mntmAddPurchaseInvoice);
        
        JMenu mnSales = new JMenu("Sales");
        menuBar.add(mnSales);
        
        JMenuItem mntmProcessSale = new JMenuItem("Generate Sales Invoice");
        mntmProcessSale.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Sale frame = new Sale();
                frame.setVisible(true);
            }
        });
        mnSales.add(mntmProcessSale);
    }
    
    public class Purchase extends JFrame {
    public void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Purchase frame = new Purchase();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public Purchase() {
        setTitle("Purchase");
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setBounds(500, 500, 300, 300);
        setLocationRelativeTo(null);
        contentPane = new JPanel();
        setContentPane(contentPane);
        }
    }   
    
    public class Sale extends JFrame {
    public void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Sale frame = new Sale();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public Sale() {
        setTitle("Sale");
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setBounds(500, 500, 300, 300);
        setLocationRelativeTo(null);
        contentPane = new JPanel();
        setContentPane(contentPane);
            }
        }
    }

这是一个非常简单的修复:为您的 'child' 帧使用 JDialog 而不是 JFrame。

public class Sale extends JDialog {
    public Sale(JFrame owner) {
        super(owner);
        setTitle("Sale");
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setBounds(500, 500, 300, 300);
        setLocationRelativeTo(null);
        contentPane = new JPanel();
        setContentPane(contentPane);
    }
}

我为 Sale 和 Purchase 都这样做了,它似乎按照描述的那样工作。我还必须更改动作侦听器代码。

mntmProcessSale.addActionListener( e -> {
            Sale frame = new Sale(this);
            frame.setVisible(true);
        });

我从匿名 class 切换到使用 this 而不是替代 Main.this 符号的语法的 lambda。