【问题标题】:paintComponent does not get called everytime I want it to每次我想要它时都不会调用paintComponent
【发布时间】:2016-01-04 00:39:27
【问题描述】:

我试图在一个小项目中使用 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 在每次值更改时实际更新?

【问题讨论】:

    标签: java algorithm swing sorting graphics2d


    【解决方案1】:

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

    更多详情请见Concurrency in Swing

    您可以通过多种方式解决此问题,您可以使用 SwingWorker 或 Swing Timer,具体取决于您的需求/能力。

    更多详情请参阅Worker Threads and SwingWorkerHow to use Swing Timers

    还可以查看 java multiple graphics 以获取可视化排序实现的示例

    【讨论】:

    • 谢谢,我去看看,但是为什么长时间运行的代码会阻止 UI 更新?毕竟这是一个命令序列,并且 UI 不应该在算法运行时更新,而是在“中断”期间更新。
    • 事件调度线程,负责处理来自事件队列的所有事件,当您使用do-while 循环阻塞它时,它无法运行。整个框架被包裹在一个线程中。我不确定您所说的“中断”是什么意思,因为您并没有真正看到它,但是,您只是将一堆脱离上下文的代码转储到您的问题中,而不是 runnable example,它证明了您的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多