java中repaint()定时刷面板问题及演示代码(附滚动条实现)
2015-08-03 11:22
507 查看
问题:1、绘画面板主要是UI线程执行,所以要注意:如果你在主线程中休眠,UI线程也会休眠,导致界面覆盖、卡顿等现象
解决:开辟一个异步线程,定时休眠,在调用repaint()重绘面板
如:
new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myPanel.repaint();//myPanel自定义的绘画面板
}
}
}).start();
问题:2、调用repaint(),重绘面板时,界面卡死,覆盖等
解决:因为repaint()会调用paint()重绘,所以要在paint()中继承父类paint(g)即可解决
public void paint(Graphics g) {
/**一定要继承这个,才会定时刷新面板!!! 关键*/
super.paint(g);
//绘画代码
}
附主要源码:
public class TestMyFrame extends JFrame{
private final int WIDTH = 800;//主框架的大小
private final int HEIGHT = 800;
private int showPanelWidth = 550;//显示面板的大小
private int showPanelHeight = 550;
private boolean isShowEdgeID = false;//显示边的ID
private MyPanel showPanel = null;//显示面板
private JScrollPane jsp=null;//滚动面板
public TestMyFrame() {
setBounds(100, 100, WIDTH, HEIGHT);
setLayout(new BorderLayout());
/**1、绘画面板*/
showPanel = new MyPanel();
new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
showPanel.repaint();//myPanel自定义的绘画面板
}
}
}).start();
add("Center",showPanel);
/**2、组件控制面板*/
add("South",new ComponentPanel());//自定义的控制面板,jCheckBox等按钮
/**3、坐标滚动面板*/
jsp = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
int[][] data = initData();
GridLayout gridLayout = new GridLayout(data.length, 1);
JPanel tempPanel = new JPanel(gridLayout);
for (int i = 0; i <data.length; i++) {
//可自行修改显示数据
JLabel jb = new JLabel("边ID="+data[i][0] + ":(" + data[i][1] + "," + data[i][2]
+ "),(" + data[i][3] + "," + data[i][4] + ")");
tempPanel.add(jb);
}
jsp.setViewportView(tempPanel);
add("East",jsp);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* 绘画面板
* @author
*
*/
private class MyPanel extends JPanel {
public void paint(Graphics g) {
/**一定要继承这个,才会定时刷新面板!!! 关键*/
super.paint(g);
//绘画代码
}
}
}
解决:开辟一个异步线程,定时休眠,在调用repaint()重绘面板
如:
new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myPanel.repaint();//myPanel自定义的绘画面板
}
}
}).start();
问题:2、调用repaint(),重绘面板时,界面卡死,覆盖等
解决:因为repaint()会调用paint()重绘,所以要在paint()中继承父类paint(g)即可解决
public void paint(Graphics g) {
/**一定要继承这个,才会定时刷新面板!!! 关键*/
super.paint(g);
//绘画代码
}
附主要源码:
public class TestMyFrame extends JFrame{
private final int WIDTH = 800;//主框架的大小
private final int HEIGHT = 800;
private int showPanelWidth = 550;//显示面板的大小
private int showPanelHeight = 550;
private boolean isShowEdgeID = false;//显示边的ID
private MyPanel showPanel = null;//显示面板
private JScrollPane jsp=null;//滚动面板
public TestMyFrame() {
setBounds(100, 100, WIDTH, HEIGHT);
setLayout(new BorderLayout());
/**1、绘画面板*/
showPanel = new MyPanel();
new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
showPanel.repaint();//myPanel自定义的绘画面板
}
}
}).start();
add("Center",showPanel);
/**2、组件控制面板*/
add("South",new ComponentPanel());//自定义的控制面板,jCheckBox等按钮
/**3、坐标滚动面板*/
jsp = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
int[][] data = initData();
GridLayout gridLayout = new GridLayout(data.length, 1);
JPanel tempPanel = new JPanel(gridLayout);
for (int i = 0; i <data.length; i++) {
//可自行修改显示数据
JLabel jb = new JLabel("边ID="+data[i][0] + ":(" + data[i][1] + "," + data[i][2]
+ "),(" + data[i][3] + "," + data[i][4] + ")");
tempPanel.add(jb);
}
jsp.setViewportView(tempPanel);
add("East",jsp);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* 绘画面板
* @author
*
*/
private class MyPanel extends JPanel {
public void paint(Graphics g) {
/**一定要继承这个,才会定时刷新面板!!! 关键*/
super.paint(g);
//绘画代码
}
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- GUI - Web前端开发框架
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 评价ui设计作品好坏的八个标准(界面/交互设计研究)
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序