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 弹出窗口位于主窗口顶部。
我的要求
- 当我点击一个菜单项时,打开的新 window 应该在之前打开的 window 的顶部并且 windows 应该在主 [=38] 之上=].
- 当我再次点击这个位置的菜单时,下拉菜单项应该覆盖所有 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。
我是 java 挥杆初学者,这是我的第一个问题。在问这个问题之前,我已经搜索了很长时间,但没有找到任何解决方案。
我有一个带有 JmenuBar 和 MenuItems 的主 window。我的问题是,当我单击菜单项时,已经打开的 window 位于主窗口 Window 下方,而新的 window 弹出窗口位于主窗口顶部。
我的要求
- 当我点击一个菜单项时,打开的新 window 应该在之前打开的 window 的顶部并且 windows 应该在主 [=38] 之上=].
- 当我再次点击这个位置的菜单时,下拉菜单项应该覆盖所有 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。