在两个不同的 JFrame 中打开的相同菜单仅适用于最后一个
Same menu opened in two different JFrames works only on the last one
我正在尝试编写一个简单的画图应用程序,用户可以在其中使用绘图面板打开新的 JFrames
(在新线程中),并且每个框架都有一个 JMenuBar
但是,只有最后一个打开的框架有一个功能菜单栏,所有剩余的(打开的)框架都显示菜单但菜单不起作用(单击时没有任何反应)。有谁知道如何解决这个问题?
我简化了代码,只留下有关 JMenuBar
的部分。
代码组成如下类:
Main.java
package sample;
public class Main {
Main() {
MainFrameThread.getMainFrameThread().run();
}//end of Main()
public static void main(String[] args) {
new Main();
}
}//end of Main class
TopMenu.java
package sample;
import javax.swing.*;
public class TopMenu extends JMenuBar {
private JMenu menu_File;
private static JMenuItem menu_New;
public static JMenuItem getMenu_New() {
return menu_New;
}
public TopMenu() {
menu_File = new JMenu("File");
menu_New = new JMenuItem("New");
this.add(menu_File);
menu_File.add(menu_New);
}//end of TopMenu()
}//end of TopMenu extends JMenuBar
MainFrameThread.java
package sample;
public class MainFrameThread extends Thread {
private static MainFrameThread mainFrameThread = new MainFrameThread();
public static MainFrameThread getMainFrameThread() {
return mainFrameThread;
}
public MainFrameThread() {}
@Override
public void run() {
MainFrame mainFrame = new MainFrame();
}//end of public void run()
}//end of public class FrameSizeDialogThread
ActionController.java
package sample;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionController {
private static ActionController actionController = new ActionController();
private ListenForMenu listenForMenu = new ListenForMenu();
public static ActionController getActionController() {
return actionController;
}
public ActionController() {}
public void clickOnMenu(TopMenu topMenu) {
TopMenu.getMenu_New().addActionListener(listenForMenu);
}
//listener for menu
public class ListenForMenu implements ActionListener {
public void actionPerformed(ActionEvent ev) {
if(ev.getSource() == TopMenu.getMenu_New()) {
MainFrame newMainFrame = new MainFrame();
}//end of if(ev.getSource() == TopMenu.getMenu_New())
}//end of public void actionPerformed(ActionEvent ev)
}//end of public class ListenForMenu
}//end of ActionController class
和MainFrame.java
package sample;
import javax.swing.*;
import java.awt.*;
public class MainFrame extends JFrame {
public MainFrame() {
JFrame frame = new JFrame("Paint Application");
//creating menu
TopMenu topMenu = new TopMenu();
ActionController.getActionController().clickOnMenu(topMenu);
frame.setJMenuBar(topMenu);
//frame properties
frame.setSize(800, 600);
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}//end of public MainFrame()
}//end of public class MainFrame
我卡住了,没有任何效果,无论我在哪里初始化 MainFrame.java。有人看错了吗???
however, only the last open frame has a functional menu bar
无法共享 Swing 组件。一个 Swing 组件只能有一个 parent。因此,对于每个 child window,您都需要创建一个新的 JMenuBar
和 JMenu
以及 JMenuItem
。
但是,JMenuItem
使用的Action
可以共享。
private static JMenuItem menu_New;
public static JMenuItem getMenu_New() {
return menu_New;
}
None 与菜单相关的变量或方法应该是静态的。同样,您需要为每个创建一个唯一的实例。
我正在尝试编写一个简单的画图应用程序,用户可以在其中使用绘图面板打开新的 JFrames
(在新线程中),并且每个框架都有一个 JMenuBar
但是,只有最后一个打开的框架有一个功能菜单栏,所有剩余的(打开的)框架都显示菜单但菜单不起作用(单击时没有任何反应)。有谁知道如何解决这个问题?
我简化了代码,只留下有关 JMenuBar
的部分。
代码组成如下类:
Main.java
package sample;
public class Main {
Main() {
MainFrameThread.getMainFrameThread().run();
}//end of Main()
public static void main(String[] args) {
new Main();
}
}//end of Main class
TopMenu.java
package sample;
import javax.swing.*;
public class TopMenu extends JMenuBar {
private JMenu menu_File;
private static JMenuItem menu_New;
public static JMenuItem getMenu_New() {
return menu_New;
}
public TopMenu() {
menu_File = new JMenu("File");
menu_New = new JMenuItem("New");
this.add(menu_File);
menu_File.add(menu_New);
}//end of TopMenu()
}//end of TopMenu extends JMenuBar
MainFrameThread.java
package sample;
public class MainFrameThread extends Thread {
private static MainFrameThread mainFrameThread = new MainFrameThread();
public static MainFrameThread getMainFrameThread() {
return mainFrameThread;
}
public MainFrameThread() {}
@Override
public void run() {
MainFrame mainFrame = new MainFrame();
}//end of public void run()
}//end of public class FrameSizeDialogThread
ActionController.java
package sample;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionController {
private static ActionController actionController = new ActionController();
private ListenForMenu listenForMenu = new ListenForMenu();
public static ActionController getActionController() {
return actionController;
}
public ActionController() {}
public void clickOnMenu(TopMenu topMenu) {
TopMenu.getMenu_New().addActionListener(listenForMenu);
}
//listener for menu
public class ListenForMenu implements ActionListener {
public void actionPerformed(ActionEvent ev) {
if(ev.getSource() == TopMenu.getMenu_New()) {
MainFrame newMainFrame = new MainFrame();
}//end of if(ev.getSource() == TopMenu.getMenu_New())
}//end of public void actionPerformed(ActionEvent ev)
}//end of public class ListenForMenu
}//end of ActionController class
和MainFrame.java
package sample;
import javax.swing.*;
import java.awt.*;
public class MainFrame extends JFrame {
public MainFrame() {
JFrame frame = new JFrame("Paint Application");
//creating menu
TopMenu topMenu = new TopMenu();
ActionController.getActionController().clickOnMenu(topMenu);
frame.setJMenuBar(topMenu);
//frame properties
frame.setSize(800, 600);
frame.setResizable(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}//end of public MainFrame()
}//end of public class MainFrame
我卡住了,没有任何效果,无论我在哪里初始化 MainFrame.java。有人看错了吗???
however, only the last open frame has a functional menu bar
无法共享 Swing 组件。一个 Swing 组件只能有一个 parent。因此,对于每个 child window,您都需要创建一个新的 JMenuBar
和 JMenu
以及 JMenuItem
。
但是,JMenuItem
使用的Action
可以共享。
private static JMenuItem menu_New;
public static JMenuItem getMenu_New() {
return menu_New;
}
None 与菜单相关的变量或方法应该是静态的。同样,您需要为每个创建一个唯一的实例。