为了账号安全,请及时绑定邮箱和手机立即绑定

在两个不同的 JFrame 中打开的相同菜单仅适用于最后一个

在两个不同的 JFrame 中打开的相同菜单仅适用于最后一个

30秒到达战场 2022-11-02 16:48:22
我正在尝试编写一个简单的 Paint 应用程序,在该应用程序中,用户将能够JFrames使用绘图面板打开新的(在新线程中),并且这些框架中的每一个都会JMenuBar在顶部有一个,但是,只有最后一个打开的框架具有功能菜单栏,所有剩余的(打开的)框架都显示菜单,但菜单不起作用(单击时没有任何反应)。有谁知道如何解决这一问题?我已经简化了代码,只留下关于JMenuBar.代码由以下类组成:主.javapackage sample;public class Main {    Main() {        MainFrameThread.getMainFrameThread().run();    }//end of Main()    public static void main(String[] args) {        new Main();    }}//end of Main classTopMenu.javapackage 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 JMenuBarMainFrameThread.javapackage 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动作控制器.javapackage 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;    }我被卡住了,不管我在哪里初始化 MainFrame.java,什么都没有。有人看错了吗???
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

然而,只有最后一个打开的框架有一个功能菜单栏


Swing 组件不能共享。Swing 组件只能有一个父组件。因此,对于每个子窗口,您都需要创建一个新的JMenuBarandJMenu和JMenuItem。


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


private static JMenuItem menu_New;


public static JMenuItem getMenu_New() {

    return menu_New;

}

与菜单相关的变量或方法都不应该是静态的。同样,您需要为每个创建一个唯一的实例。


查看完整回答
反对 回复 2022-11-02
  • 1 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信