【发布时间】:2016-03-29 07:28:44
【问题描述】:
我正在尝试分配一个在JFrame 中实现Runnable 接口的JPanel。我制作了这个样本来解释我的想法。我想添加一个多线程面板,该面板将文本作为演示显示到窗口中,String 作为新实例的参数。面板应该有独立的进程,所以我实现了Runnable 接口。但是当我尝试使用我的类的新实例创建一个新的面板实例时,它不起作用。
我做错了什么?
imagePanel 面板类:
public class imagePanel extends JPanel implements Runnable{
JLabel imageTest;
public imagePanel(String textLabel)
{
this.setPreferredSize(new Dimension(300,300));
imageTest = new JLabel(textLabel);
imageTest.setPreferredSize(this.getPreferredSize());
}
public void setImageText(String newText){
imageTest.setText(newText);
}
public void run(){
this.add(imageTest);
}
}
主类测试类:
public class test {
public static void main(){
JFrame frame = new JFrame("Test Window");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(300,300));
JPanel panel = new imagePanel("Text label");
panel.setPreferredSize(frame.getPreferredSize());
frame.add(panel);
frame.setVisible(true);
}
}
【问题讨论】:
-
创建一个“多线程面板”不是很漂亮。 Panel 是一个用户界面组件,它不应该对线程做任何事情。同样在你的代码中
run()永远不会被调用,所以它也被“破坏”了。 -
您忘记给面板添加标签
-
@SergiyMedvynskyy 虽然发布的示例肯定不会添加标签,但假设他们创建了一个
Thread,它在实际代码中的某个位置包装了panel的实例this.add(imageTest);应该被调用......但这是很多“如果” -
对不起,这只是我正在尝试做的工作的一个示例,我写得很快,我正在使用 Opencv API 使用相机进行人脸识别,需要一个独立的进程用于该类并直接显示在面板中。
-
回复:“一个实现 Runnable 的 JPanel”听起来明显违反了单一职责原则 (en.wikipedia.org/wiki/Single_responsibility_principle)
标签: java multithreading swing runnable