繁体   English   中英

如何通过单击第一个Java Windows应用程序(Jframe)中的菜单项启动第二个Jframe

[英]How to start 2nd Jframe by click menu item in 1st java windows application (Jframe)

我正在Java中使用eclipse 4.2。

我有2个Java程序: AppWin.java Form1.java

AppWin.java是带有menu/menu item1 gui Windows应用程序。

Form1.java是Gui Jframe

我想通过单击menu/menu item1AppWin.java调用Form1.java 关闭Form1.java ,它将返回到AppWin.java

这就像MDIFORM一样。 我真的找不到答案。 请帮助,如果您知道蚀菜单。

谢谢

package top;

import java.awt.EventQueue;

public class AppWin {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    AppWin window = new AppWin();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

...

在您的帮助下,我迈出了一大步。 感谢大家!

接下来是我的最终演示,在Windows 7,Eclipse 4.2,Java Gui中,希望对其他人有帮助。

共有3个部分:AppWin,Form1,Form2。 AppWin是使用菜单/项目调用Form1和Form2的主要工具。

//1
package top;

import java.awt.EventQueue;

public class AppWin {

    private JFrame frame;

    private Form1 form1;
    private Form2 form2;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    AppWin window = new AppWin();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public AppWin() {
        initialize();
        form1 = new Form1();
        form2 = new Form2();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);

        JMenu mnNewMenu = new JMenu("Menu1");
        menuBar.add(mnNewMenu);

        JMenuItem mntmNewMenuItem = new JMenuItem("menu item1");
        mntmNewMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                form1.setVisible(true);
            }
        });
        mnNewMenu.add(mntmNewMenuItem);

        JMenuItem mntmNewMenuItem_1 = new JMenuItem("menu item2");
        mntmNewMenuItem_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                form2.setVisible(true);
            }
        });
        mnNewMenu.add(mntmNewMenuItem_1);

        JMenu mnNewMenu_1 = new JMenu("Menu2");
        menuBar.add(mnNewMenu_1);

        JMenuItem mntmMenuItem = new JMenuItem("Menu item3");
        mnNewMenu_1.add(mntmMenuItem);
    }

}

//2
package top;

import java.awt.BorderLayout;

public class Form1  extends JFrame {

    private JPanel contentPane;
    private JTextField textField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Form1 frame = new Form1();
                    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Form1() {
//      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JLabel lblNewLabel = new JLabel("this Form1");
        contentPane.add(lblNewLabel, BorderLayout.WEST);

        textField = new JTextField();
        contentPane.add(textField, BorderLayout.CENTER);
        textField.setColumns(10);

        JButton btnNewButton = new JButton("New button");
        contentPane.add(btnNewButton, BorderLayout.EAST);
    }

}

//3
package top;

import java.awt.BorderLayout;

public class Form2 extends JDialog {

    private final JPanel contentPanel = new JPanel();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            Form2 dialog = new Form2();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the dialog.
     */
    public Form2() {
        setBounds(100, 100, 450, 300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setLayout(new FlowLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        {
            JLabel lblThisForm = new JLabel("This Form2");
            contentPanel.add(lblThisForm);
        }
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
            {
                JButton okButton = new JButton("OK");
                okButton.setActionCommand("OK");
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
            {
                JButton cancelButton = new JButton("Cancel");
                cancelButton.setActionCommand("Cancel");
                buttonPane.add(cancelButton);
            }
        }
    }

}

再次感谢

为此,您最好使用JDesktopPane + JInternalFrame 这是一个快速示例。

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;

    import javax.swing.AbstractAction;
    import javax.swing.JDesktopPane;
    import javax.swing.JFrame;
    import javax.swing.JInternalFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;

    public class JInternalFrameSample {

        private JPanel pnlMain;
        private JDesktopPane desk;

        public JInternalFrameSample(){
            pnlMain = new JPanel(new BorderLayout()){
                @Override public Dimension getPreferredSize(){
                    return new Dimension(600,600);
                }
            };
            desk = new JDesktopPane();

            JMenuBar bar = new JMenuBar();
            JMenu menu = new JMenu("Internal Frame");
            JMenuItem item = new JMenuItem();

            item.setAction(new AbstractAction("Create New") {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    JInternalFrame iFrame = new JInternalFrame("Created from Menu");
                    iFrame.setResizable(true);
                    iFrame.setClosable(true);
                    iFrame.setIconifiable(true);
                    iFrame.setSize(new Dimension(300, 300));
                    iFrame.setLocation(0, 0);

                    //iFrame.getContentPane().setLayout(new BorderLayout());
                    //iFrame.getContentPane().add( new YourCustomUI().getUI() );

                    iFrame.setVisible(true);
                    desk.add(iFrame);
                }
            });


            menu.add(item);
            bar.add(menu);

            pnlMain.add(bar, BorderLayout.PAGE_START);
            pnlMain.add(desk, BorderLayout.CENTER);
        }

        private JPanel getUI(){
            return pnlMain;
        }

        public static void main(String[] args){
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new JFrame("Demo");
                    frame.getContentPane().setLayout(new BorderLayout());
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.getContentPane().add(new JInternalFrameSample().getUI());
                    frame.pack();
                    frame.setVisible(true);
                }
            });
        }
    }

另请参阅: 如何使用内部框架

如果您不喜欢JDesktopPane和JInternalFrame解决方案,只需按原样使用AppWin JFrame,然后为其余表单(而不是JFrame)打开模式JDialogs。 模式对话框可以在桌面周围浮动,并且除非关闭它们,否则不允许您单击AppWin。

通常最好只对一个应用程序使用一个主JFrame,除非您有一些向导应用程序从一个JFrame逐渐移到另一个JFrame,然后又移回另一个。 即使使用向导应用程序,您也可以坚持使用一个JFrame并仅使用JPanels逐步更新ContentPane。

这是AppWin JFrame:

public class AppWin extends javax.swing.JFrame {
    private Form1 form1;
    private Form1 form2;
    ...
    private FormN formN;

    public AppWin() {
        initComponents();
        form1 = new Form1(this, true);
        form2 = new Form2(this, true);
        ...
        formN = new FormN(this, true);
    }
    ...
    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        form1.setVisible(true);
    }

这是您的Form1 JDialog:

public class Form1 extends javax.swing.JDialog {
    public Form1(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }
    ...
    private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
        setVisible(false);
    }      

我只使用NetBeans进行GUI构建,因为这样更方便。 在下面的内容中,我可以告诉您如何实现所需的操作,但是由于NetBeans可以为我完成这些操作,因此我无法告诉您如何布置所有组件。

因此,基本上,您想要1.通过单击菜单项然后关闭mainFrame来显示secondFrame,2.关闭secondFrame之后再显示mainFrame,是吗? 然后,关键是将mainFrame的引用传递给secondFrame,并编写您自己的secondFrame的formClosing事件方法。 像这样:

在大型机的menuItem方法中:

private void menuItemActionPerformed(java.awt.event.ActionEvent evt) {
    //pass 'this' frame's (mainFrame) reference to the secondFrame
    SecondFrame newFrame = new SecondFrame(this);
    newFrame.setVisible(true); //show the secondFrame
    this.setVisible(false);  //hide this frame (mainFrame)
}

在您的secondFrame中:

public class SecondFrame extends javax.swing.JFrame {

private MainFrame mainFrame;

//define your own constructor that can use mainFrame's reference
public SecondFrame(MainFrame mainFrame) {
    initComponents();
    this.mainFrame = mainFrame;
}

private void initComponents(){
    //bind your own event for closing second frame
    setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
    addWindowListener(new java.awt.event.WindowAdapter() {
        public void windowClosing(java.awt.event.WindowEvent evt) {
            formWindowClosing(evt);
        }
    });

    /***********your stuff***************/
}

//show mainFrame when closing this frame and then dispose this frame
private void formWindowClosing(java.awt.event.WindowEvent evt) {
    mainFrame.setVisible(true);
    this.dispose();
}

}

上面的代码用于在关闭第二个框架时将其放置。 如果您只想在关闭时隐藏secondFrame以便将来使用,则代码将略有不同。 让我知道你在做什么。

私人无效jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt){
form1.setVisible(true); dispose(); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM