从另一个JFrame窗口中的按钮单击打开一个新的JFrame窗口

时间:2018-05-12 08:47:02

标签: java swing user-interface jframe

更新:我认为目前最简单的事情就是使用单独的JPane而不是JFrame用于子菜单。我将它们全部组合在一起并将其他组件设置为不可见,并以此方式切换。菜单不是那么复杂,这太麻烦了。

我正在创建一个GUI,通过另一个按钮点击打开另一个JFrame窗口。我只是不确定在单击其中一个按钮时关闭主窗口的正确方法,但不是关闭整个程序。我也不确定如何让第二个窗口可见(我从另一个例子尝试的代码行不能正常工作)。提出的第二个框架将为用户提供做事的选项,并且实际上会调用另一个程序/类来运行在其中单击的按钮(其中一个选项的结果是一个长程序,所以我想我需要运行它在另一个线程上。)程序运行完毕后,用户可以选择返回主菜单,关闭第二个菜单(并将其关闭),或退出程序(从而终止主菜单并清理所有内容)。从主菜单中,他们还可以选择关闭程序,清理所有内容。这就是我到目前为止所做的:

主GUI:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


class GUIMain implements ActionListener {

    GUIMain(){
        JFrame jFrm = new JFrame("Data Mining Application");
        jFrm.setSize(800,600);
        jFrm.setLayout(new BorderLayout());
        jFrm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        prepareGUI(jFrm.getContentPane());
        jFrm.pack();
        jFrm.setVisible(true);

    }

    private void prepareGUI(final Container pane){

        JPanel mainPanel = new JPanel(new GridLayout(3,2,50,50));

        JButton b1 = new JButton("Pre-processing");
        b1.addActionListener(this);
        mainPanel.add(b1);


        pane.add(mainPanel,BorderLayout.CENTER);


    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GUIMain();
            }
        });

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        switch (e.getActionCommand()){
            case "Pre-processing":
                PreProcessingGUI window = new PreProcessingGUI();
                window.getFrame.setVisible(true); //not working
                break;
          // etc
            default:
                break;
        }
    }
}

调用的类和JFrame:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class PreProcessingGUI implements ActionListener {

    PreProcessingGUI(){
        JFrame jFrm = new JFrame("Pre-processing");
        jFrm.setSize(800,600);
        jFrm.setLayout(new BorderLayout());
        jFrm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        prepareGUI(jFrm.getContentPane());
        jFrm.pack();
    }


    private void prepareGUI(final Container pane) {
    //do stuff
    }


    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    PreProcessingGUI window = new PreProcessingGUI();

                    // Not surewhat to do here either as the program is not recognising the getFrame method
                    //window.getFrame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    // do stuff
    }
}

1 个答案:

答案 0 :(得分:0)

我对Swing的工作不多,但我可以帮助你一点:

当您尝试在GUIMain.actionPerformed中显示第二个窗口时,您似乎尝试使用具有方法(getFrame)的公共变量来获取框架。

window.getFrame.setVisible(true);

此变量不存在!它没有在任何地方定义。这里没有魔力!

您应该在getFrame()中实施PreProcessingGUI 方法,并将其用于代替您的变量。

GUIMain.actionPerformed

window.getFrame().setVisible(true);

PreProcessingGUI

public class PreProcessingGUI implements ActionListener {
    private JFrame jFrm; //You asssing is as you the constructor
    PreProcessingGUI(){
        jFrm = new JFrame("Pre-processing");
        ...
    }
    public getFrame(){
        return jFrm;
    }
...

除此之外,我会说你应该考虑使用JDialog(并且可选择使其成为模态)而不是JFrame