Java - Ejecutar un programa en consola de Java desde un Botón con Jframe

 
Vista:
sin imagen de perfil

Ejecutar un programa en consola de Java desde un Botón con Jframe

Publicado por Luis (1 intervención) el 28/05/2023 11:06:33
Hola, mi problema es que quiero ejecutar un programa hecha en programación orientada a objetos y ese programa se ejecuta desde la consola de Java con un botón hecha con Jframe, el problema es que ya intente creando el objeto y colocando el setVisible(false); con el dispose(); pero al momento de darle clic me aparece como si hubiera cerrarlo el programa, cabe declarar que son 11 programas ósea 11 botones
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ejecutar un programa en consola de Java desde un Botón con Jframe

Publicado por Kabuto (1383 intervenciones) el 28/05/2023 14:39:18
Llevo un rato intentándolo y tampoco lo consigo.

A ver, con setVisible(false) si consigo ocultar el JFrame principal en el momento en que se abre la ventana de consola de comandos donde se ejecuta el otro programa Java.
El problema es que no se cómo detectar que la ventana de consola termina y se cierra, momento en el que debería pedirle al JFrame que volviera a ser visible.

Pongo aquí el ejemplo que estaba intentando desarrollar, a ver si alguien saber ayudarnos a completarlo.

En un package llamado programasCMD tengo un par de programas destinados a ejecutar en consola de comandos.
Son un simple "Hola Mundo" y un programa para sumar dos números introducidos por teclado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package programasCMD;
 
import java.util.Scanner;
 
public class HolaMundo {
 
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);
		System.out.println("Hola Mundo");
		System.out.println("\n\t\tFIN DE PROGRAMA");
		System.out.println("Pulse ENTER para cerrar continuar...");
		teclado.nextLine();
		teclado.close();
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package programasCMD;
 
import java.util.Scanner;
 
public class Sumar {
 
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);
		System.out.println("\t\tSUMAR DOS NUMEROS");
		System.out.print("Primer numero: ");
		int num1 = Integer.parseInt(teclado.nextLine());
		System.out.print("Segundo numero: ");
		int num2 = Integer.parseInt(teclado.nextLine());
		System.out.println("\nLa suma es: " + (num1+num2));
		System.out.println("\n\t\tFIN DE PROGRAMA");
		System.out.println("Pulse ENTER para cerrar continuar...");
		teclado.nextLine();
		teclado.close();
 
	}
}

En otro package llamado gui, es donde tengo la clase JFrame principal.
El JFrame tiene dos botones para lanzar cada uno de esos dos programas, los cuáles mediante la clase ProcessBuilder se abre una ventana de consola de sistema y se ejecutan esos programas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
public class Lanzador extends JFrame {
 
	private JButton btProg1;
	private JButton btProg2;
 
	public Lanzador() {
		btProg1 = new JButton("Saludo");
		btProg1.addActionListener(new LanzarSaludo());
		btProg2 = new JButton("Sumar");
		btProg2.addActionListener(new LanzarSuma());
 
		JPanel pnMensaje = new JPanel();
		pnMensaje.add(new JLabel("Elija un programa"));
		pnMensaje.setBorder(BorderFactory.createCompoundBorder(
				BorderFactory.createEmptyBorder(20,30,20,30),
				BorderFactory.createRaisedSoftBevelBorder()));
 
		JPanel pnBotones = new JPanel();
		pnBotones.add(btProg1);
		pnBotones.add(btProg2);
		pnBotones.setBorder(BorderFactory.createCompoundBorder(
				BorderFactory.createEmptyBorder(20,30,20,30),
				BorderFactory.createLoweredSoftBevelBorder()));
 
		setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
		add(pnMensaje);
		add(pnBotones);
 
		setTitle("Lanzador");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private void ocultar() {
		setVisible(false);
	}
	private void mostrar() {
		setVisible(true);
	}
 
	private class LanzarSaludo implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			ocultar();
			ProcessBuilder pb = new ProcessBuilder();
			pb.command(Arrays.asList("cmd", "/C", "Start","java", "HolaMundo.java"))
			          .directory(new File("src/programasCMD"));
 
			try {
				Process proceso = pb.start();
 
				while(proceso.isAlive());
 
				mostrar();
 
			} catch (Exception e1) {
				e1.printStackTrace();
			}
 
		}
	}
 
	private class LanzarSuma implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			ocultar();
			ProcessBuilder pb = new ProcessBuilder();
			pb.command(Arrays.asList("cmd", "/C", "Start","java", "Sumar.java"))
			          .directory(new File("src/programasCMD"));
 
			try {
				Process proceso = pb.start();
 
				while(proceso.isAlive());
 
				mostrar();
 
			} catch (Exception e1) {
				e1.printStackTrace();
			}
 
		}
	}
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
 
			@Override
			public void run() {
				new Lanzador();
			}
		});
	}
}

Vale, si nos fijamos en uno de los ActionListeners para los botones, por ejemplo el que lanza el programa para "sumar", vemos que lo primero que hago es ocultar el JFrame.
Luego configuro el proceso que ha de lanzar el programa y comienza.

Por último vuelvo a mostrar el JFrame.

Y claro, ocurre que el JFrame vuelve a ser visible de inmediato, mientras la ventana de comandos está ejecutando el otro programa Java.

Ahí se puede ver que intento con el método isAlive(), como condición de un bucle vacío, paralizar la ejecución del programa principal mientras el proceso esté "vivo"

1
2
3
4
5
6
try {
				Process proceso = pb.start();
 
				while(proceso.isAlive());
 
				mostrar();

Pero no sirve, resulta que el proceso no "muere" cuando termina el programa Java en la consola. El proceso "muere" cuando ha terminado de abrir ventana y lanzar el programa Java, no cuando dicho programa termina.

Necesitamos una forma de detectar cuándo finaliza el programa de consola. A ver si a alguien se le ocurre como enfocar esto.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar un programa en consola de Java desde un Botón con Jframe

Publicado por Tom (1831 intervenciones) el 29/05/2023 08:27:23
A ver. @Kabuto, tienes más info de la que hay en la cuestión :D
Si describes qué se pretende hacer ... igual ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ejecutar un programa en consola de Java desde un Botón con Jframe

Publicado por Kabuto (1383 intervenciones) el 01/06/2023 10:02:34
Hola Tom.

Mi intención, y creo que la de Luis también, es hacer que la interfaz gráfica se oculte tras lanzar uno de los programas que se ejecutan en la ventana de comandos.
En realidad eso es fácil, lo difícil (o tal vez imposible) es hacer que regrese cuando la ejecución de esa ventana de comandos haya finalizado

Si desde esta interfaz lanzo un programa
lanzador

Comienza un programa en la ventana de comandos, pero la interfaz sigue siendo visible
lanzador2

Y tengo el capricho de querer ocultar la interfaz hasta que se haya cerrado esa ventana de comandos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar un programa en consola de Java desde un Botón con Jframe

Publicado por Tom (1831 intervenciones) el 02/06/2023 11:08:50
Bueno, a mí esto me funciona (en Linux):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class TestExec extends JFrame implements ActionListener {
	/* */
	TestExec() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JButton b_exec = new JButton("Launch proc");
		add(b_exec);
		b_exec.addActionListener(this);
		pack();
	}
	/* */
	@Override
	public void actionPerformed(ActionEvent e) {
		this.setState(ICONIFIED);
		try {
			File sal = new File("/tmp/output");
			ProcessBuilder pb = new ProcessBuilder("find", "/usr/local", "-ls");
			pb.redirectErrorStream(true);
			pb.redirectOutput(Redirect.appendTo(sal));
			Process pf = pb.start();
			pf.waitFor();
			this.setState(NORMAL);
 
		} catch(IOException | InterruptedException ex) {
			Logger.getLogger(TestExec.class.getName()).log(Level.SEVERE, null, ex);
		}
	}
 
	/* */
	public static void main(String[] args) {
		new TestExec().setVisible(true);
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar