swing在线程wait之后界面不刷新,怎么办?

walkuere 2016-07-23 08:53:53

package swingproblem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
public class Entrance extends JFrame implements ActionListener{
public static Entrance entrance;
public WaitThread storywait=new WaitThread();
JButton abc=new JButton("abcde");
public static void main(String args[]){
entrance=new Entrance();
entrance.setBounds(0,0,1024,768);
entrance.setLayout(null);

entrance.drawsomething();
entrance.waiting();
entrance.setVisible(true);
}
public void drawsomething(){
abc.setBounds(0,0,100,30);
this.add(abc);
}
public void waiting(){
storywait.start();
//if (false)//这里如果让它wait,那么整个项目就卡死
while (storywait.wakeup==false) {
synchronized (storywait){
try {
entrance.revalidate();
storywait.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("success");
}
@Override
public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource()==abc){
synchronized (storywait){
storywait.wakeup();
}
}
}
}
class WaitThread extends Thread{
public boolean wakeup=false;
public void wakeup(){
wakeup=true;
synchronized(this) {
notify();
}
}
public void run(){
}
}


如果用if (false)把线程wait注释掉,整个就好的
我不知道该怎么解决,请高手帮一把
...全文
199 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rickylin86 2016-07-24
  • 打赏
  • 举报
回复
你上面的代码其实上必须分为三个线程处理。生成界面一个 wait一个 notify一个(按钮点击实现) 所以你的大程序也自己留意下.主界面跟wait不能在同一个线程
walkuere 2016-07-24
  • 打赏
  • 举报
回复
可是弄到我自己的大程序里还是不行
walkuere 2016-07-24
  • 打赏
  • 举报
回复
引用 1 楼 rickylin86 的回复:
你看下下面的代码是否是你需要的结果. 修修补补一下而已.毕竟不是自己写的代码所以看得挺凌乱的 [/code]
非常感谢,终于弄出来了,谢谢!!!
rickylin86 2016-07-24
  • 打赏
  • 举报
回复
你看下下面的代码是否是你需要的结果. 修修补补一下而已.毕竟不是自己写的代码所以看得挺凌乱的

//package swingproblem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import static javax.swing.JFrame.EXIT_ON_CLOSE;

public class Entrance extends JFrame implements ActionListener{
	public static Entrance entrance;
	public WaitThread storywait=new WaitThread();
	JButton abc=new JButton("abcde");

	public static void main(String args[]){
		SwingUtilities.invokeLater(new Runnable(){//创建窗口的代码最好是单独放到一个线程中.
			@Override
			public void run(){
				entrance=new Entrance();
				entrance.setBounds(0,0,1024,768);
				entrance.setLayout(null);
				entrance.drawsomething();
				
				entrance.setDefaultCloseOperation(EXIT_ON_CLOSE);
				entrance.setVisible(true);
				
			}
		});

		try{
			Thread.sleep(1000);//这里休眠为了确保上面窗口线程已经执行.
		}catch(InterruptedException e){
			e.printStackTrace();
		}

		entrance.waiting();
		
	}
	public void drawsomething(){	
		abc.setBounds(0,0,100,30);
		this.add(abc);
		abc.addActionListener(this);//按钮需要添加监听器.否则点按钮也无效.
	}

	public void waiting(){
	while (storywait.wakeup==false)	{
		synchronized (storywait){
			try {
				entrance.revalidate();
				System.out.println("before");//增加这里为了测试
				storywait.wait();
				System.out.println("after");//增加这里为了测试
			} catch (InterruptedException e) {
				e.printStackTrace();
			}	
		}	
	}
	System.out.println("success");
}
@Override
	public void actionPerformed(ActionEvent arg0) {
		if (arg0.getSource()==abc){
			synchronized (storywait){
				storywait.wakeup();
			}	
		}
	}
}


class WaitThread{//这里没必要继承线程.因为本身只是作为一个同步的对象而已.
	public boolean wakeup=false;
	public void wakeup(){
		wakeup=true;
		synchronized(this)	{
			notify();//这里最好用notifyAll().虽然本题用notify也可以.
		}
	}
	
}

walkuere 2016-07-24
  • 打赏
  • 举报
回复
引用 4 楼 rickylin86 的回复:
你上面的代码其实上必须分为三个线程处理。生成界面一个 wait一个 notify一个(按钮点击实现) 所以你的大程序也自己留意下.主界面跟wait不能在同一个线程
终于解决了,非常感谢!!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧