Java 单JFrame中的多线程
我试图创建两个线程,每个线程在一个帧中为自己的面板工作,我的意思是,我试图在一个帧中同时更改图像,但在一个帧中更改两个相同大小的不同面板中的图像 我已经做了两个不同的帧运行自己的图像,但我想在一个单独的帧在它自己的面板 我的编码是:Java 单JFrame中的多线程,java,multithreading,swing,Java,Multithreading,Swing,我试图创建两个线程,每个线程在一个帧中为自己的面板工作,我的意思是,我试图在一个帧中同时更改图像,但在一个帧中更改两个相同大小的不同面板中的图像 我已经做了两个不同的帧运行自己的图像,但我想在一个单独的帧在它自己的面板 我的编码是: import javax.swing.*; import org.omg.CORBA.Object; import java.awt.*; class subviewer1 extends JFrame implements Runnable{ Thre
import javax.swing.*;
import org.omg.CORBA.Object;
import java.awt.*;
class subviewer1 extends JFrame implements Runnable{
Thread t2 = new Thread();
JFrame f1;
//JLabel label;
JPanel p1;
ImageIcon icon; //= new ImageIcon("C:\\img.png");
JLabel label = new JLabel(icon);
int imgPath = 1;
public subviewer1(){
super();
t2.start();
/*
f1 = new JFrame("PIC VIEWER");
f1.setLayout(null);
f1.setSize(500,500);
f1.setLocation(0,0);
p1 = new JPanel();
while(true)
{
try {
while (true) {
Thread.sleep(1000);
p1.setSize(500,500);
p1.setLocation(0,0);
switch(imgPath)
{
case 1:
//f1.remove(p1);
p1.remove(label);
p1.setVisible(false);
p1.removeAll();
ImageIcon icon = new ImageIcon("C:\\img.png");
JLabel label = new JLabel(icon);
p1.add(label);
p1.setVisible(true);
imgPath = 2;
break;
case 2:
//f1.remove(p1);
p1.removeAll();
p1.setVisible(false);
ImageIcon icon1 = new ImageIcon("C:\\img1.png");
JLabel label1 = new JLabel(icon1);
p1.add(label1);
p1.setVisible(true);
imgPath = 3;
break;
case 3:
//f1.remove(p1);
p1.removeAll();
p1.setVisible(false);
ImageIcon icon2 = new ImageIcon("C:\\img2.png");
JLabel label2 = new JLabel(icon2);
p1.add(label2);
p1.setVisible(true);
imgPath = 4;
break;
case 4:
//f1.remove(p1);
p1.setVisible(false);
p1.removeAll();
ImageIcon icon3 = new ImageIcon("C:\\img3.png");
JLabel label3 = new JLabel(icon3);
p1.add(label3);
p1.setVisible(true);
imgPath = 1;
break;
}
f1.add(p1);
f1.setVisible(true);
f1.setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} catch (InterruptedException iex) {
System.out.println(iex);
}
}
//initComponents();
}
@Override
public void run() {
{
f1 = new JFrame("PIC VIEWER");
//f1.setLayout(null);
f1.setSize(500,500);
f1.setLocation(0,0);
p1 = new JPanel();
while(true)
{
try {
while (true) {
Thread.sleep(1000);
p1.setSize(250,500);
p1.setLocation(0,0);
switch(imgPath)
{
case 1:
//f1.remove(p1);
p1.remove(label);
p1.setVisible(false);
p1.removeAll();
ImageIcon icon = new ImageIcon("C:\\img.png");
JLabel label = new JLabel(icon);
p1.add(label);
p1.setVisible(true);
imgPath = 2;
break;
case 2:
//f1.remove(p1);
p1.removeAll();
p1.setVisible(false);
ImageIcon icon1 = new ImageIcon("C:\\img1.png");
JLabel label1 = new JLabel(icon1);
p1.add(label1);
p1.setVisible(true);
imgPath = 3;
break;
case 3:
//f1.remove(p1);
p1.removeAll();
p1.setVisible(false);
ImageIcon icon2 = new ImageIcon("C:\\img2.png");
JLabel label2 = new JLabel(icon2);
p1.add(label2);
p1.setVisible(true);
imgPath = 4;
break;
case 4:
//f1.remove(p1);
p1.setVisible(false);
p1.removeAll();
ImageIcon icon3 = new ImageIcon("C:\\img3.png");
JLabel label3 = new JLabel(icon3);
p1.add(label3);
p1.setVisible(true);
imgPath = 1;
break;
}
f1.add(p1);
f1.setVisible(true);
f1.setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} catch (InterruptedException iex) {
System.out.println(iex);
}
}
}
}
}
及
这是针对不同的帧…但我希望在单个帧中完成…因此请更正我的代码或使用******线程.睡眠(int args);*******执行类似的代码只有Swing不是线程安全的。也就是说,您只需要从单个线程(称为事件调度线程(又称EDT))中访问、更改或创建UI元素 您也不应该阻止EDT,例如使用
睡眠
、等待
或阻止IO
虽然有许多可能的解决方案,但最简单的方法是使用javax.swing.Timer
,因为它在EDT上下文中执行其计时,但在等待时不会阻止它
请查看以了解更多详细信息
我还建议简单地使用
JLabel
来显示图标,而不是添加和删除图标,只需将图标设置为新图像的参考Swing不是线程安全的。也就是说,您只需要从单个线程(称为事件调度线程(又称EDT))中访问、更改或创建UI元素
您也不应该阻止EDT,例如使用睡眠
、等待
或阻止IO
虽然有许多可能的解决方案,但最简单的方法是使用javax.swing.Timer
,因为它在EDT上下文中执行其计时,但在等待时不会阻止它
请查看以了解更多详细信息
我还建议您只需使用JLabel
来显示图标,而不是添加和删除图标,只需将图标设置为新图像的参考即可(1)为了更快地获得更好的帮助,请发布一个。2) 请对代码、输入/输出和结构化文档(如HTML或XML)使用代码格式。为此,请选择示例并单击消息发布/编辑表单上方的{}
按钮。3) 请对“you”、“your”和“Please”等词使用正确的拼写。这使人们更容易理解和帮助。1)要更快地获得更好的帮助,请发布一篇文章。2) 请对代码、输入/输出和结构化文档(如HTML或XML)使用代码格式。为此,请选择示例并单击消息发布/编辑表单上方的{}
按钮。3) 请对“you”、“your”和“Please”等词使用正确的拼写。这使得人们更容易理解和帮助。
class subviewer2 extends JFrame implements Runnable{
Thread t1 = new Thread();
JFrame f1;
//JLabel label;
JPanel p2;
ImageIcon icon; //= new ImageIcon("C:\\img.png");
JLabel label = new JLabel(icon);
int imgPath = 1;
public subviewer2(){
super();
t1.start();
/*
f1 = new JFrame("PIC VIEWER");
f1.setLayout(null);
f1.setSize(500,500);
f1.setLocation(0,0);
p1 = new JPanel();
while(true)
{
try {
while (true) {
Thread.sleep(1000);
p1.setSize(500,500);
p1.setLocation(0,0);
switch(imgPath)
{
case 1:
//f1.remove(p1);
p1.remove(label);
p1.setVisible(false);
p1.removeAll();
ImageIcon icon = new ImageIcon("C:\\img4.png");
JLabel label = new JLabel(icon);
p1.add(label);
p1.setVisible(true);
imgPath = 2;
break;
case 2:
//f1.remove(p1);
p1.removeAll();
p1.setVisible(false);
ImageIcon icon1 = new ImageIcon("C:\\img5.png");
JLabel label1 = new JLabel(icon1);
p1.add(label1);
p1.setVisible(true);
imgPath = 3;
break;
case 3:
//f1.remove(p1);
p1.removeAll();
p1.setVisible(false);
ImageIcon icon2 = new ImageIcon("C:\\img6.png");
JLabel label2 = new JLabel(icon2);
p1.add(label2);
p1.setVisible(true);
imgPath = 4;
break;
case 4:
//f1.remove(p1);
p1.setVisible(false);
p1.removeAll();
ImageIcon icon3 = new ImageIcon("C:\\img7.png");
JLabel label3 = new JLabel(icon3);
p1.add(label3);
p1.setVisible(true);
imgPath = 1;
break;
}
f1.add(p1);
f1.setVisible(true);
f1.setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} catch (InterruptedException iex) {
System.out.println(iex);
}
}
//initComponents();
}
@Override
public void run() {
{
f1 = new JFrame("PIC VIEWER");
// f1.setLayout(null);
f1.setSize(500,500);
f1.setLocation(0,0);
p2 = new JPanel();
while(true)
{
try {
while (true) {
Thread.sleep(1000);
p2.setSize(350,500);
p2.setLocation(250,0);
switch(imgPath)
{
case 1:
//f1.remove(p1);
p2.remove(label);
p2.setVisible(false);
p2.removeAll();
ImageIcon icon = new ImageIcon("C:\\img4.png");
JLabel label = new JLabel(icon);
p2.add(label);
p2.setVisible(true);
imgPath = 2;
break;
case 2:
//f1.remove(p1);
p2.removeAll();
p2.setVisible(false);
ImageIcon icon1 = new ImageIcon("C:\\img5.png");
JLabel label1 = new JLabel(icon1);
p2.add(label1);
p2.setVisible(true);
imgPath = 3;
break;
case 3:
//f1.remove(p1);
p2.removeAll();
p2.setVisible(false);
ImageIcon icon2 = new ImageIcon("C:\\img6.png");
JLabel label2 = new JLabel(icon2);
p2.add(label2);
p2.setVisible(true);
imgPath = 4;
break;
case 4:
//f1.remove(p1);
p2.setVisible(false);
p2.removeAll();
ImageIcon icon3 = new ImageIcon("C:\\img7.png");
JLabel label3 = new JLabel(icon3);
p2.add(label3);
p2.setVisible(true);
imgPath = 1;
break;
}
f1.add(p2);
f1.setVisible(true);
f1.setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} catch (InterruptedException iex) {
System.out.println(iex);
}
}
}
}
}
public class thdmkr extends Thread{
Thread t1,t2;
subviewer1 obj1 = new subviewer1();
subviewer2 obj2 = new subviewer2();
public thdmkr(){
//super();
t1 = new Thread(obj1);
t2 = new Thread(obj2);
t1.start();
t2.start();
}
public static void main(String args[]){
thdmkr obj = new thdmkr();
}
public void run(){
}
}