【发布时间】:2015-02-11 07:39:01
【问题描述】:
我有两个类,一个主类和一个扩展 JPanel 并实现 Runnable 的类。我正在尝试在 actionListener 中为 JPanel 类的同一个实例创建两个线程,但我只是不知道在哪里创建 JPanel1 对象...
//编辑:按钮1是应用程序的开始。之后,按钮2将出现一个带有标签的快速动画,当点击它时(按钮2)也将启动相同的动画。每当单击这些按钮之一以启动运行方法时,我该怎么办?
public void run() {
if(isTom){
repaint();
revalidate();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
panel.removeAll();
panel.add(tomLabel1);
repaint();
revalidate();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
panel.add(tomLabel2);
repaint();
revalidate();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
panel.add(tomLabel3);
repaint();
revalidate();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
panel.add(tomLabel4);
repaint();
revalidate();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
panel.add(tomLabel5);
repaint();
revalidate();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
panel.removeAll();
repaint();
revalidate();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
public Game(){
JFrame frame = new JFrame();
Panel1 key = new Panel1();
key.addKeyListener(key);
frame.add(key);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.setVisible(true);
}
public static void main(String[] args) {
new Game();
}
public class Panel1 extends JPanel implements KeyListener,Runnable{
JButton button1 = new JButton("BUTTON1");
JButton button2 = new JButton("BUTTON2");
add(button1);add(button2);
Thread t = new Thread(this); // This works, but i need it inside the actionListener.
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("button1");
Thread x = new Thread(j);//'j' is an JPanel1 object. I need something like this i guess
x.setName("Thread x");});
button2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("button2");
Thread y = new Thread(j);
y.setName("Thread y");
});
public void run(){
System.out.println(Thread.currentThread().getName());
}
【问题讨论】:
-
不确定这里的问题是什么,您应该添加更多关于您正在尝试做什么的信息,例如,这些线程将要做什么。看起来您可能偏离了您正在尝试做的事情,因此提供该信息可能是最好的。
-
围绕 Runnable 的单个实例创建线程将使线程同时执行 runnable。如果您不希望这样,请让面板类创建一个 Runnable 并通过 getter 将其返回
-
记住,swing 是单线程的,不是线程安全的
-
我也不确定我是否理解它,但也许你想要这个:
Thread y = new Thread(this.Panel1);这将在你的 Panel1 类的同一个实例中运行你的线程。