【问题标题】:How to launch an .exe file by clicking a JButton in GUI?如何通过单击 GUI 中的 JButton 来启动 .exe 文件?
【发布时间】:2015-12-14 14:49:10
【问题描述】:

我创建了一个带有 3 个 Jbutton 的 JFrame。我希望该按钮启动位于同一文件夹中的不同 .exe 文件。这可能吗?如果是,我应该为 actionListener 写什么?另一方面,是否可以使用 JButton 启动主类,而不是启动 exe 文件?如果是,我应该为 actionListener 写什么?

注意:.exe 文件是从 java 主程序创建的。

JButton button1 = new JButton("Program1"); //The JButton name.
frame.add(button1); //Add the button to the JFrame.
button1.addActionListener().... // how to launch the .exe file

提前致谢

【问题讨论】:

    标签: java exe jbutton actionlistener


    【解决方案1】:
    Runtime.getRuntime().exec( ... );
    

    或使用 ProcessBuilder 类。

    您应该能够在网络上找到使用这些类的示例。

    编辑:例如,要在 Windows 中启动记事本 exe,您可以这样做:

    Process process = Runtime.getRuntime().exec( "cmd.exe /C start notepad" );
    

    如果你想执行一个类,那么你需要像从命令行调用它一样调用 JVM。

    【讨论】:

      【解决方案2】:

      您可能有兴趣查看executing an external process

      这需要Runtime.getRuntime().exec 或更新的ProcessBuilder

      【讨论】:

        【解决方案3】:

        我认为如果你不是从 GUI 调用它,你会使用 Runtime.exec() 或类似于调用 exe 程序的 ProcessBuilder。需要注意的一些事情是,您可能希望在 Swing 主线程(EDT)之外的后台线程上调用 Runtime.exec(),例如由 SwingWorker 对象提供的。否则,当 exe 程序接管 Swing 线程时,您的 GUI 可能会冻结。此外,您还需要关注这篇精彩文章中显示的有关调用 Runtime.exec() 的所有警告, When Runtime.exec() won't,可能是关于该主题的最佳文章之一——强烈推荐!

        问题:我不清楚这个陈述是什么意思?:

        注意:program.exe 文件是从 java 主程序创建的。

        【讨论】:

        • 注:我用java写了一个mainProgram类,并使用该类创建了.exe文件。但是,不使用 .exe 文件,是否可以使用我的 JButton 来启动一个类(使用 mainProgram)?如果是,我应该为 actionListener 写什么?
        • 我的主,是的,事实上这是调用其他 Java 代码的首选方式。您可以在动作侦听器中创建一个新对象并调用其方法。这个其他类是另一个 Swing GUI 吗?如果是这样,还有其他可能很重要的考虑因素,您可能希望向我们提供更多详细信息。
        • 不是耶稣。另一个类也是主程序,但它没有 GUI。因此,当我运行 GUI 类(也是一个主类)并单击按钮时,它将从另一个主类运行程序。问题是,我在 actionListener 行中写什么来调用其他类?
        • @Mike,您已获得要使用的课程。您在网上搜索时发现了哪些示例?你在理解这些例子时有什么问题?发布您的 SSCCE (sscce.org),展示您的尝试,以便我们了解您可能遇到的问题。
        • 您总是可以将 main 方法作为类的静态方法来调用,但这有一种糟糕的设计和破坏 OOP 结构的味道。我同意 Rob Camick 的观点,您需要向我们提供更多更好的信息,以便我们能够为您提供更好的答案,包括创建和发布一个小程序,一个说明问题的 SSCCE。
        【解决方案4】:

        这是一个替代答案,无需通过 Runtime.getRuntime().exec(...) 创建新进程 - 您也可以维护 System.in/out 通道。然而, 如果您是 Java 编程世界的新手并试图学习其中的技巧,我建议您遵循 camickr 的建议,不要像下面描述的那样弄乱 ClassLoader。

        我假设您需要运行的类是自包含的(不使用内部类)并且不在您的类路径或 jarfile 中,因此您可以创建一个实例并调用它的 main()。 如果涉及多个类文件,只需重复加载它们的方法即可。

        所以,在你的 JButton addActionListener()-ed 到的 ActionListener 中...

        public void actionPerformed (ActionEvent e) {
            String classNameToRun = e.getActionCommand(); // Or however you want to get it
            try {
                new MyClassLoader().getInstance(classNameToRun).main (null);
            } catch (ClassNotFoundException ce) {
                JOptionPane.showMessageDialog (null, "Sorry, Cannot load class "+classNameToRun,
                                    "Your title", JOptionPane.ERROR_MESSAGE);
        }}
        

        你需要一个新的类 MyClassLoader 已经在你的类路径中。这是一个伪代码:

        import java.io.*;
        import java.security.*;
        
        public class MyClassLoader extends ClassLoader {
        
                protected       String classDirectory = "dirOfClassFiles" + File.separator,
                                        packageName = "packageNameOfClass.";
        
                /**
                 * Given a classname, get contents of the class file and return it as a byte array.
                 */
        
                private byte[] getBytes (String className) throws IOException {
                        byte[] classBytes = null;
                        File file = new File (classDirectory + className + ".class");
        
                        // Find out length of the file and assign memory
                        // Deal with FileNotFoundException if it is not there
                        long len = file.length();
                        classBytes = new byte[(int) len];
        
                        // Open the file
                        FileInputStream fin = new FileInputStream (file);
        
                        // Read it into the array; if we don't get all, there's an error.
                        // System.out.println ("Reading " + len + " bytes");
                        int bCount = fin.read (classBytes);
                        if (bCount != len)
                                throw new IOException ("Found "+bCount+" bytes, expecting "+len );
        
                        // Don't forget to close the file!
                        fin.close();
                        // And finally return the file contents as an array
                        return classBytes;
                }
        
                public Class loadClass (String className, boolean resolve)
                                                        throws IOException, ClassNotFoundException,
                                                        IllegalAccessException, InstantiationException {
                        Class myClass = findLoadedClass (packageName + className);
                        if (myClass != null)
                                return myClass;
        
                        byte[] rawBytes = getBytes (className);
                        myClass = defineClass (packageName + className,
                                                        rawBytes, 0, rawBytes.length);
                        // System.out.println ("Defined class " +packageName + className);
                        if (myClass == null)
                                return myClass;
                        if (resolve)
                                resolveClass (myClass);
        
                        return myClass;
                }
        
                public Object getInstance (String className) throws ClassNotFoundException {
                        try {
                                return loadClass (className, true).newInstance();
                        } catch (InstantiationException inExp) {        inExp.printStackTrace();
                        } catch (IllegalAccessException ilExp) {        ilExp.printStackTrace();
                        } catch (IOException ioExp) {                   ioExp.printStackTrace();
                        }
                        return null;
                }
        }
        

        注意事项: 当您尝试加载的类驻留在本地计算机上并且您从命令行运行 java 时,这很有效。我从来没有成功地尝试让一个小程序从某个 servlet 下载一个类文件并加载它——安全性不允许这样做。在这种情况下,解决方法就是在另一个窗口中运行另一个小程序,但那是另一个线程。上面的类加载解决了你可能需要的每一个类文件的问题 - 只是为了启动 GUI。祝你好运,-MS

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-22
          • 2011-02-07
          • 1970-01-01
          • 2014-11-24
          • 2015-05-27
          • 1970-01-01
          • 1970-01-01
          • 2012-12-10
          相关资源
          最近更新 更多