java 多线程画图 不显示过程
我用java写了个小程序,是用repaint在JFrame里面画图,用thread.sleep(500)控制画图速度,而且每画一步都更新一次label显示画了多少次。运行...
我用java写了个小程序,是用repaint在JFrame里面画图,用thread.sleep(500)控制画图速度,而且每画一步都更新一次label显示画了多少次。运行中不报错,但是点下去开始按钮后按钮一直保持在按下的状态,直到画完才弹起,label只在最后更新了一次,显示为15步,而图像没有任何动静。最小化再还原,才显示出画完最后一步的结果。本人菜鸟,对此困惑不已,请各位高手赐教~
大致了解了一些,但是我改了半天无法运用到我的程序上……
我新提问了一个,题目相同,源代码在里面,麻烦您看下,解决了分都给你 展开
大致了解了一些,但是我改了半天无法运用到我的程序上……
我新提问了一个,题目相同,源代码在里面,麻烦您看下,解决了分都给你 展开
展开全部
画图一般要用到所谓的双缓冲。稍等,我给你个例子。
好了,弄了半天,原来是Frame和JFrame双缓冲有点细微的区别,用JFrame还得自己重绘背景……也算学习了。
我写了个画一个矩形运行的例子,通过按核者钮可控制其运行状态,同时,用一个Label统计起运动补数。其实并不复杂,拷贝到IDE中看吧,主要注意双缓冲。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class DrawPicture extends JFrame implements ActionListener {
public static final int C_WIDTH = 800;
public static final int C_HEIGHT = 600;
public static final int SLEEP_TIME = 500; //画图速度
boolean flag = false;
JLabel label = null;
JButton btn_start = null;
JButton btn_stop = null;
public DrawPicture(String title) {
super(title);
label = new JLabel("就绪");
btn_start = new JButton("开始");
btn_stop = new JButton("旅氏宴暂停");
JPanel panel = new JPanel();
DrawPanel center = new DrawPanel();
setLayout(new BorderLayout());
add(center,BorderLayout.CENTER);
add(panel,BorderLayout.SOUTH);
panel.add(label);
panel.add(btn_start);
panel.add(btn_stop);
btn_start.addActionListener(this);
btn_stop.addActionListener(this);
setSize(C_WIDTH, C_HEIGHT);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
new Thread(center).start();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btn_start) {
flag = true;
} else if(e.getSource()==btn_stop) {
flag = false;
}
}
public static void main(String[] args) {
DrawPicture f = new DrawPicture("画图统计");
}
//内部类,画图面板
class DrawPanel extends JPanel implements Runnable {
Image offScreen = null;
int x = 10;
int y = 30;
int count = 0;
public void paint(Graphics g) {
//<重绘背景
g.setColor(Color.WHITE);
g.fillRect(0, 0, C_WIDTH,C_HEIGHT );
//>
/拆银/画图
g.setColor(Color.black);
g.fillRect(x,y,50,50);
}
//双缓冲,图像不闪烁
public void update(Graphics g) {
if(offScreen==null) {
offScreen = createImage(C_WIDTH,C_HEIGHT);
}
Graphics offg = offScreen.getGraphics();
Color c = offg.getColor();
offg.setColor(Color.WHITE);
offg.fillRect(0, 0, C_WIDTH,C_HEIGHT);
offg.setColor(c);
paint(offg);
g.drawImage(offScreen, 0, 0, null);
}
public void run() {
while(true) {
if(flag) {
x++;
y++;
count++;
label.setText("画图计数:"+count);
repaint();
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
好了,弄了半天,原来是Frame和JFrame双缓冲有点细微的区别,用JFrame还得自己重绘背景……也算学习了。
我写了个画一个矩形运行的例子,通过按核者钮可控制其运行状态,同时,用一个Label统计起运动补数。其实并不复杂,拷贝到IDE中看吧,主要注意双缓冲。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class DrawPicture extends JFrame implements ActionListener {
public static final int C_WIDTH = 800;
public static final int C_HEIGHT = 600;
public static final int SLEEP_TIME = 500; //画图速度
boolean flag = false;
JLabel label = null;
JButton btn_start = null;
JButton btn_stop = null;
public DrawPicture(String title) {
super(title);
label = new JLabel("就绪");
btn_start = new JButton("开始");
btn_stop = new JButton("旅氏宴暂停");
JPanel panel = new JPanel();
DrawPanel center = new DrawPanel();
setLayout(new BorderLayout());
add(center,BorderLayout.CENTER);
add(panel,BorderLayout.SOUTH);
panel.add(label);
panel.add(btn_start);
panel.add(btn_stop);
btn_start.addActionListener(this);
btn_stop.addActionListener(this);
setSize(C_WIDTH, C_HEIGHT);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
new Thread(center).start();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btn_start) {
flag = true;
} else if(e.getSource()==btn_stop) {
flag = false;
}
}
public static void main(String[] args) {
DrawPicture f = new DrawPicture("画图统计");
}
//内部类,画图面板
class DrawPanel extends JPanel implements Runnable {
Image offScreen = null;
int x = 10;
int y = 30;
int count = 0;
public void paint(Graphics g) {
//<重绘背景
g.setColor(Color.WHITE);
g.fillRect(0, 0, C_WIDTH,C_HEIGHT );
//>
/拆银/画图
g.setColor(Color.black);
g.fillRect(x,y,50,50);
}
//双缓冲,图像不闪烁
public void update(Graphics g) {
if(offScreen==null) {
offScreen = createImage(C_WIDTH,C_HEIGHT);
}
Graphics offg = offScreen.getGraphics();
Color c = offg.getColor();
offg.setColor(Color.WHITE);
offg.fillRect(0, 0, C_WIDTH,C_HEIGHT);
offg.setColor(c);
paint(offg);
g.drawImage(offScreen, 0, 0, null);
}
public void run() {
while(true) {
if(flag) {
x++;
y++;
count++;
label.setText("画图计数:"+count);
repaint();
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询