当单击主窗口上的菜单项时,主窗口的内容窗格中的 Java 已打开的窗口位于主窗口下方



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

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

我的要求

  1. 当我单击菜单项时,打开的新窗口应该在先前打开的窗口的顶部,并且两个窗口都应该在主窗口上方。
  2. 当我再次单击此位置的菜单时,下拉菜单项应该位于所有窗口之上。

我已经尝试过设置AlwaysOnTop(true(;到所有菜单项窗口。 但它无法满足我的要求(2.(

请帮助我

这是我的主窗口代码

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);
}
}
}

这是一个非常简单的修复:使用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);
}
}

我为销售和购买都这样做了,它似乎按照描述工作。我还必须更改操作侦听器代码。

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

我从一个匿名类切换到一个lambda,用于使用this而不是替代Main.this表示法的语法。

最新更新