Java运行其他类的main方法,当JButton被按下时

Posted

技术标签:

【中文标题】Java运行其他类的main方法,当JButton被按下时【英文标题】:Java running main method of other class, when JButton is pressed 【发布时间】:2013-11-03 18:05:57 【问题描述】:

我正在尝试开发一个 JFrame,它有两个按钮,可以让我调用其他类的主要方法。第一次尝试是直接把它放在每个按钮的actionPerformed中,这会导致另一个类的JFrame打开但只显示它的标题而不显示JPanel的任何内容另外冻结程序(甚至不能按关闭按钮,必须进入任务管理器或 Eclipse 才能杀死它)。第二次尝试是在 actionPerformed 中添加一个方法调用,这次添加该方法将调用其他类的 main 方法,但结果相同(程序冻结)。

出于测试目的,我将调用其他类的 main 方法,直接放在这个类的 main 方法中,这向我证明了其他类的框架已经成功出现,包括它的所有 JPanel 内容、功能等。

我知道我可以在我的 main 方法中创建某种无限循环来等到布尔值设置为 true,但是我认为必须有一些更便宜的方法来让它工作。所以我在这里向你们提出这个问题。

这是第二次尝试的代码;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


    public class Chat 
    public static void main (String[] args) 


        JFrame window = new JFrame("Chat Selection");

        //Set the default operation when user closes the window (frame)
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Set the size of the window
        window.setSize(600, 400);
        //Do not allow resizing of the window
        window.setResizable(false);
        //Set the position of the window to be in middle of the screen when program is started
        window.setLocationRelativeTo(null);

        //Call the setUpWindow method for setting up all the components needed in the window
        window = setUpWindow(window);

        //Set the window to be visible
        window.setVisible(true);

    

    private static JFrame setUpWindow(JFrame window) 
        //Create an instance of the JPanel object
        JPanel panel = new JPanel();
        //Set the panel's layout manager to null
        panel.setLayout(null);

        //Set the bounds of the window
        panel.setBounds(0, 0, 600, 400);

        JButton client = new JButton("Run Client");
        JButton server = new JButton("Run Server");
        JLabel author = new JLabel("By xxx");

        client.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent e) 
                //run client main
                runClient();
            
        );

        server.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent e) 
                //run server main
            
        );

        panel.add(client);
        client.setBounds(10,20,250,200);
        panel.add(server);
        server.setBounds(270,20,250,200);
        panel.add(author);
        author.setBounds(230, 350, 200, 25);

        window.add(panel);

        return window;
    

    private static void runClient() 

        String[] args1="10";
        ClientMain.main(args1);
    

【问题讨论】:

对不起,我忘记在测试目的中添加“直接在已证明的此类主要方法中”。刚刚编辑以更正它 你阻塞了主线程,反过来它会冻结你的 UI。使用线程。 【参考方案1】:

每个应用程序只允许使用一种主要方法。老实说,当您在其他课程上调用 main 时,我不确定您正在尝试做什么或认为应该发生什么。当您在其他类上调用 main 时,您所做的就是调用一个恰好被称为 main 的方法并将 args 传递给它。您的冻结可能是因为您没有正确使用 Swing:

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

【讨论】:

【参考方案2】:

您遇到的问题是 Java Swing 是单线程的。当您运行另一个类的主要功能时,无论您如何操作,GUI 都将无法继续运行,直到它返回。尝试生成一个调用第二个 main 方法的新线程。

private static void runClient() 
    SwingUtilities.invokeLater(new Runnable() 
        @Override
        public void run() 
            String[] args1="10";
            ClientMain.main(args1);
        
    );

编辑:根据@Radiodef 的建议进行了更新。当您说第二类必须在 GUI 上显示内容时,在顶部错过了。那么肯定要使用invokeLater。

【讨论】:

OP 仍然需要使用 invokeLater 创建 GUI。如果他们只这样做,他们仍然做错了。 让我害怕的是这是选择的答案。 OP 对 Java 编程一无所知,只学到了如何创建线程来做他们不应该做的事情。我的猜测是你知道这一点。如果是这样,我想做得很好。 @Radiodef,只是回答一些问题以直接解决他的问题。调用 main 方法并没有什么问题。他可以有两个类,这两个类通常是两个应用程序的主要类,而这只是一个测试工具。另外,invokeLater 主要用于修改 GUI。如果您不必触摸 GUI(我怀疑他这样做),那么启动他自己的线程也一样好。这很好地解释了这一切:ntu.edu.sg/home/ehchua/programming/java/J5e_multithreading.html ...该页面也提出了一个很好的观点。如果有循环,可能需要“睡眠”。 好吧,我很抱歉对您的意图做出假设,但该链接确实还指示使用 invokeLater 创建 GUI,就像任何地方一样。根据 OP,程序所做的只是创建和修改 GUI。 错过了“导致其他类的 JFrame 打开”的细节......你绝对是对的。

以上是关于Java运行其他类的main方法,当JButton被按下时的主要内容,如果未能解决你的问题,请参考以下文章

类,main()方法

PHP怎么调用其他类的方法

java swingworker线程更新main Gui

从java main方法说开去(转)

java游戏开发之JRadioButton

使用 JButton 在 Java 中创建自定义按钮