Одно и то же меню, открытое в двух разных JFrames, работает только на последнем - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь написать простое приложение Paint, в котором пользователь сможет открывать новые 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.Кто-нибудь видит ошибку ???

1 Ответ

2 голосов
/ 02 мая 2019

однако, только последний открытый кадр имеет функциональную строку меню

Компоненты Swing не могут быть общими. У компонента Swing может быть только один родитель. Так что для каждого дочернего окна вам нужно будет создать новые JMenuBar и JMenu и JMenuItem.

Однако Action, используемый JMenuItem, может использоваться совместно.

private static JMenuItem menu_New;

public static JMenuItem getMenu_New() {
    return menu_New;
}

Ни одна из переменных или методов, связанных с меню, не должна быть статической. Опять же, вам нужно создать уникальный экземпляр каждого.

...