您的位置:首页 > 编程语言 > Java开发

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);
//绘画代码

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java ui 线程 界面