加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 我需要从另一个JFrame启动一个JFrame并让它像独立的应用

发布时间:2020-12-15 07:37:26 所属栏目:Java 来源:网络整理
导读:我有一个没有主动渲染的JFrame,一个标准的基本Swing应用程序,我需要在单击一个按钮时启动另一个JFrame.第二个JFrame使用Swing的BufferStrategy进行主动渲染,并独立运行 – 但是,当我从其他JFrame的ActionPerformed中调用它时,两个JFrame都会冻结. 我知道使用
我有一个没有主动渲染的JFrame,一个标准的基本Swing应用程序,我需要在单击一个按钮时启动另一个JFrame.第二个JFrame使用Swing的BufferStrategy进行主动渲染,并独立运行 – 但是,当我从其他JFrame的ActionPerformed中调用它时,两个JFrame都会冻结.

我知道使用Swing来完成这种行为是很复杂的 – 我怎么能绕过它们?

解决方法

您可能能够调整使用的基于Swing的 Launcher
ProcessBuilder在单独的JVM中运行程序.

image

package gui;

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * @see https://stackoverflow.com/a/5696404/230513
 */
public class Launcher extends JPanel implements Runnable {

    private final JLabel label = new JLabel();
    private final JButton launch = new JButton();
    ProcessBuilder pb = new ProcessBuilder(
        "java","-cp","build/classes","gui.Launcher$DialogTest");
    private volatile Process proc;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Launcher()::createGUI);
    }

    private void createGUI() {
        final JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(0,1));
        frame.add(new Launcher());
        frame.add(new Launcher());
        frame.add(new Launcher());
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public Launcher() {
        this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
        this.setBorder(BorderFactory.createEmptyBorder(8,8,8));
        launch.setAlignmentX(0.5f);
        label.setAlignmentX(0.5f);
        launch.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (proc == null) {
                    launch.setText("Terminate");
                    label.setText("Status: run");
                    new Thread(Launcher.this).start();
                } else {
                    proc.destroy();
                    reset();
                }
            }
        });
        this.add(launch);
        this.add(label);
        reset();
    }

    @Override
    public void run() {
        try {
            proc = pb.start();
            proc.waitFor();
        } catch (IOException | InterruptedException ex) {
            ex.printStackTrace(System.err);
        }
        EventQueue.invokeLater(this::reset);
    }

    private void reset() {
        proc = null;
        launch.setText("Launch");
        label.setText("Status: idle");
    }

    private static class DialogTest {

        public static void main(String[] args) {
            EventQueue.invokeLater(() -> {
                JOptionPane.showMessageDialog(null,"Running","Test",JOptionPane.INFORMATION_MESSAGE);
                System.exit(0);
            });
        }
    }
}

根据作者的要求更新到Java 8.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读