我试图在一个小项目中使用 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 SwingWorker和 How to use Swing Timers了解更多详情
另请查看 java multiple graphics一个可视化排序实现的例子
关于java - paintComponent 每次我想要它时都不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981090/