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

标签 java algorithm swing sorting graphics2d

我试图在一个小项目中使用 Graphics2D 和 Swing 可视化排序算法(不知道这是不是一个好主意,我只是为了好玩),然后到了我会调用更新方法的地步,因此调用了 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 在每次值更改时实际更新?

最佳答案

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

参见 Concurrency in Swing了解更多详情。

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

参见 Worker Threads and SwingWorkerHow to use Swing Timers了解更多详情

另请查看 java multiple graphics一个可视化排序实现的例子

关于java - paintComponent 每次我想要它时都不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981090/

相关文章:

java - 代码示例中 Java 的正则表达式问题

java - ArrayIndexOutOfBoundsException 即将到来

java - 使用 Mockito.when() 和泛型类型推断的奇怪泛型边缘案例

arrays - 在二维数组中创建一个 "path"(用于迷宫)——有什么算法思路吗?

javascript - 在网格中查找随机放置的元素 (x,y)

java - 设置 JComboBox 的背景?

java - 如何将 Eclipse 动态 Web 项目上传到实时服务器?

java - 我在 Java Swing TreeNode 中已经有一个复选框。但我该如何使其可检查呢?

java - 如何让嵌入式Jpanel走向WEST

algorithm - 表示小无符号整数的最有效位格式