从内部循环重新绘制JPanel

时间:2014-01-08 10:26:30

标签: java swing repaint

是否可以从另一个对象的循环中重新绘制JPanel?我有一个由JPanel(DrawPanel)和SA对象组成的JFrame。我想在此SA对象的while循环期间更新/重新绘制JPanel。我开始了一个新线程,但仍然没有执行panel.repaint()。

public class Mainform extends JFrame {
    private DrawPanel DrawPanel;
    public static void main(String[] args) {
        DrawPanel panel = new DrawPanel();
        SA sa = new SA(panel);
        Thread t = new Thread(sa);
        t.start();
        //...
    }
}
public class DrawPanel extends JPanel implements MouseMotionListener, MouseListener {
    public DrawPanel() {
        super();
        setBackground(Color.WHITE);
        addMouseWheelListener(this);
        addMouseListener(this);
        addMouseMotionListener(this);
    }
    //...
}
public class SA implements Runnable {
    private DrawPanel panel;
    public SA(DrawPanel p) {
        this.panel = p;
        init();
    }
    public void run() {
        while (true) {
            //...
            panel.repaint();
        }
    }
}

编辑:运行是公开的

1 个答案:

答案 0 :(得分:2)

基本答案是“是”。

这假设您尝试重新绘制的组件是

  1. 添加到容器
  2. 该容器附加到某种本地对等方(即窗口)
  3. 该窗口可见。
  4. RepaintManager通常很聪明,知道不要浪费时间画一些不可显示的东西。

    以下示例相当基本,但每次调用时都会在paintComponent JPanel内增加一个计数器。附加到Runnable的{​​{1}}将每秒更新一次......

    Thread