Java 如何在已扩展线程的类中扩展JFrame

Java 如何在已扩展线程的类中扩展JFrame,java,swing,inheritance,jframe,Java,Swing,Inheritance,Jframe,我有一个扩展Thread的类,需要在同一个类上扩展JFrame。既然Java中不可能有多重继承,那么如何在已经扩展了Thread的类中使用JFrame对象呢?而不是扩展Thread,您能让该类实现可运行吗?通过这种方式,您可以扩展JFrame,将其传递给线程 public class MyFrameThread extends JFrame implements Runnable { @Override public void run() { ... }

我有一个扩展Thread的类,需要在同一个类上扩展JFrame。既然Java中不可能有多重继承,那么如何在已经扩展了Thread的类中使用JFrame对象呢?

而不是扩展Thread,您能让该类实现可运行吗?通过这种方式,您可以扩展JFrame,将其传递给线程

public class MyFrameThread extends JFrame implements Runnable {

    @Override
    public void run() {
        ...
    }
}

public static void main(String... args) {
    Thread myThread = new Thread(new MyFrameThread());
    myThread.start();
    myThread.join();
}

您可以轻松地使用JFrames和线程,而无需扩展它们,正如大多数人所建议的,您通常最好不要扩展它们。扩展它们会将类绑定到JFrame,从而防止以后在JPanel、JDialog等中使用它。如果没有必要,为什么要这样限制自己?

与其扩展JFrame或线程,不如使用composition,它的限制性要小得多:

public class MyApplication {
    JFrame applicationFrame;

    Thread someThread;

    MyApplication() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override void run() {
                applicationFrame = new JFrame();

                // some more GUI initialization.
                applicationFrame.setVisible(true);
            }
        });

        someThread = new Thread(new Runnable() {
            @Override void run() {
                // do my work.
            }
        });

        someThread.start();
    }

    public static void main(String... args) {

        new MyApplication();
    }
}

Swing GUI对象应仅在上构造和操作。为什么要扩展JFrame?为什么首先需要扩展JFrame?这通常是不必要的。请参阅关于扩展JFrame的问题:通常不应该扩展JFrame或线程。问题解决了。在generali am用java编写套接字程序时,扩展JFrame是个坏主意。我唯一的经验是在安卓系统中,所以JavaSwing与我习惯的不同。因此,我将不扩展JFrame,而是创建没有任何GUI的控制台应用程序。我这样做是为了测试一些稍后将在Android中使用的套接字代码。