同一菜单在两个不同的Jframes中仅作用于最后一个菜单



我正在尝试编写一个简单的油漆应用程序,其中用户将能够使用绘图面板打开新的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。有人看到错误吗???

但是,只有最后一个开放式框架具有功能性菜单栏

摇摆组件无法共享。摆动组件只能有单亲。因此,对于每个子窗口,您需要创建一个新的JMenuBarJMenuJMenuItem

但是,可以共享JMenuItem使用的Action

private static JMenuItem menu_New;
public static JMenuItem getMenu_New() {
    return menu_New;
}

与菜单相关的变量或方法不应静态。同样,您需要创建每个独特的实例。

最新更新