每次我想要它时都不会调用paintComponent

时间:2015-10-06 22:53:10

标签: java algorithm swing sorting graphics2d

我试图用Graphics2D和Swing来形象化排序算法(不知道这是不是一个好主意,我只是为了好玩而做)在一个小项目中,并且我将调用update方法,从而调用paintCompenent每次数组中的元素更改其值时的方法。

问题是paintComponent方法只在算法完成后才会被调用。这是算法的代码:

private void sortBubble() {
    int n = array.length;
    do {            
        int newn = 1;
        for (int i = 0; i < n - 1; i++) {
            if (array[i] > array[i + 1]) {                  
                int index = array[i];                       
                array[i] = array[i + 1];                                    
                array[i + 1] = index;
                System.out.println("SWITCHED"); 
                this.setChanged();
                this.notifyObservers();
                newn = i + 1;                   
            }
        }
        n = newn;
    } while (n > 1);    
}

更新方法的代码:

public void update(Observable o, Object arg) {
    if(draw!=null)  {
        drawPanel.remove(draw);         
    }       
    draw = new Plotter(array.array,this.getWidth(),this.getHeight());   
    drawPanel.add(draw);  
    drawPanel.validate();       
    System.out.println("UPDATED");
}

JPanel类的代码:

private void draw(Graphics g) {     
    g2d = (Graphics2D) g;
    int i;                  
    for(i=0;i<array.length;i++) {
        g2d.draw(new Line2D.Double(i, height, i, height-array[i]));             
    }           
}

@Override
public void paintComponent(Graphics g) {            
    super.paintComponent(g);
    draw(g);
    System.out.println("PLOTTED");
}   

有没有办法让JPanel每次更改时实际更新?

1 个答案:

答案 0 :(得分:1)

Swing是一个单线程框架,这意味着任何长时间运行/阻塞代码都会导致程序“停顿”,从而阻止它更新UI或响应用户输入。

有关详细信息,请参阅Concurrency in Swing

有几种方法可以解决这个问题,您可以使用SwingWorker或Swing Timer,具体取决于您的需求/能力。

有关详细信息,请参阅Worker Threads and SwingWorkerHow to use Swing Timers

另请参阅java multiple graphics以获取可视化排序实现的示例

相关问题