如何在已经扩展 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的主要内容,如果未能解决你的问题,请参考以下文章
如何从扩展 JobService 的类中调用将视图作为参数的 MainActivity 方法?