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中运行程序.
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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java – 使用非泛型实现覆盖泛型方法
- java – Log4j如何阻止我的记录器打印到控制台?
- java – 将List转换为Map并过滤null键
- java – 添加exec-maven-plugin的附加路径
- java – studio.sh在ubuntu中为android studio拒绝开放权限
- 详解springboot中使用异步的常用两种方式及其比较
- java – Spring hibernate jdbc批量大小
- java – 在NetBeans GUI Designer中重用JPanel
- java – 在一个事务中组合JPA和JDBC操作
- Java HttpURLConnection使用方法详解