如何在已经扩展 Thread 的类中扩展 JFrame

Posted

技术标签:

【中文标题】如何在已经扩展 Thread 的类中扩展 JFrame【英文标题】:how to extend JFrame in a class that already extends Thread 【发布时间】:2013-01-23 17:36:07 【问题描述】:

我有一个扩展 Thread 的类,需要在同一个类上扩展 JFrame。由于 Java 中无法实现多重继承,如何在已经扩展 Thread 的类中使用 JFrame 对象?

【问题讨论】:

Swing GUI 对象应在event dispatch thread 上构造和操作。为什么要扩展JFrame 为什么首先需要扩展 JFrame?通常不需要。 关于扩展 JFrame 的问题请参见:***.com/questions/1143923/… 您通常应该扩展 既不 JFrame 或 Thread。问题解决了。 【参考方案1】:

使用组合而不是扩展 JFrame 或 Thread,它的限制要少得多:

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();
    

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

除了扩展 Thread 之外,你可以让类实现 Runnable 吗?这样,您可以改为扩展 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();

【讨论】:

扩展 JFrame 通常是个坏主意 我正在用 java 制作一个套接字程序。我唯一的经验是在 android 中,所以 java swing 与我习惯的不同。因此,我将制作没有任何 GUI 的控制台应用程序,而不是扩展 JFrame。我这样做是为了测试我稍后将在 Android 中使用的套接字代码。

以上是关于如何在已经扩展 Thread 的类中扩展 JFrame的主要内容,如果未能解决你的问题,请参考以下文章

扩展片段的类中的选项卡

如何从在android中扩展应用程序的类中显示对话框?

如何从扩展 JobService 的类中调用将视图作为参数的 MainActivity 方法?

Typescript 中的类中扩展的类型是啥?

无法解析扩展 FragmentActivity 的类中的方法 getActivity()

类别可以访问它扩展的类中定义的实例变量吗?