El código de GUI predeterminado cuando utiliza el generador de ventanas es el siguiente.

import java.awt.EventQueue;
import javax.swing.JFrame;

public class Goo {

private JFrame frame;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Goo window = new Goo();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Goo() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Quiero ejecutar esto desde otra clase como hilo. Entonces la otra clase se verá así,

public class GooRun {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Goo myGoo = new Goo();
    Thread myThread = new Thread(myGoo);
    myThread.start();

}
}

No entiendo completamente cómo funciona el método de ejecución cuando no está utilizando implementos Runnable o amplía Thread.

El error que recibo es que el constructor no está definido. Thread (Goo) no está definido.

0
romarshmallow 15 dic. 2016 a las 23:58

2 respuestas

La mejor respuesta

Puedes hacer una de las dos cosas:

Primera opción: hacer que myGoo implemente Runnable:

public class Goo implements Runnable{

Y luego agregue un método run en Goo:

@Override
public void run() {
    try {
        Goo window = new Goo();
        window.frame.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Y después de eso, puede hacer lo que hizo en el otro main:

public static void main(String[] args){
    Goo myGoo = new Goo();
    Thread myThread = new Thread(myGoo);
    myThread.start();
}

Básicamente, esto convierte a Goo en algo que se puede iniciar cuando se inicia un hilo (de ahí la implementación Runnable).

O

Opción 2: en tu main, puedes crear un hilo con un ejecutable:

public static void main(String[] args){
    Thread t = new Thread(new Runnable() {
        
        @Override
        public void run() {
            Goo myGoo = new Goo();      
            
        }
    });
    t.start(); 
}
3
Community 20 jun. 2020 a las 09:12

La solución 1 de ItamarG3 es en realidad una mala idea. En ese caso, tiene 2 instancias (una de run() y otra de main()) de Goo mientras no las necesita.

Debe llamar a this.frame.setVisible(true); en el run() y no new otra instancia de Goo.

0
Yijun Li 3 sep. 2018 a las 15:01