Я работаю над параллельным холстом, написанным на Java, который заставит пользователей думать, что они рисуют на холсте параллельно.SwingUtilities.invokeLater не работает как ожидалось
Для того, чтобы достигнуть воспринимаемого пользователем параллелизма, я получаю их для создания этих объектов Runnable, которые я продвигаю и добавляю EventQueue с помощью SwingUtilities.invokeLater().
Чтобы проверить это, я смоделировал пользователей, используя пару потоков, и добавил немного задержки (около 50 мс) между каждым вызовом invokeLater(), чтобы увидеть, действительно ли это выглядит так, как это происходит. в параллели.
Проблема заключается в том, что, хотя она отлично работала с этой добавленной задержкой между вызовами invokeLater(), извлечение этой задержки приводит к тому, что рисунки рисуются должным образом, частично отрисовываются и иногда исчезают и просто не рисуются в другое время ,
Я очень зациклен на том, что может произойти неправильно, поэтому любой, если у кого есть какие-либо идеи, сообщите мне.
Ниже приводится код с задержкой закомментированного:
public void run(){
//add tasks on to the event queue of the EDT
for(int i = 0; i<numLines; i++){
DrawLineTask task = new DrawLineTask(g, x1, y1+i, x2, y2+i, lineColor);
SwingUtilities.invokeLater(task);
// try {
// Thread.sleep(new Double(Math.random()*50).longValue());//random sleeping times to make it appear more realistic
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
Приветствия
EDIT: Вот код для DrawLineTask по запросу. Его довольно просто, как просто расширение класса Runnable, которое рисует линию, используя стандартную функцию Java по заданным параметрам.
public class DrawLineTask implements Runnable {
Graphics g;
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
Color color = Color.BLACK;
public DrawLineTask(Graphics g, int x1, int y1, int x2, int y2){
this.g = g;
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
public DrawLineTask(Graphics g, int x1, int y1, int x2, int y2, Color color){
this.g = g;
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.color = color;
}
@Override
public void run() {
g.setColor(color);
g.drawLine(x1, y1, x2, y2);
}
}
Просто догадайтесь, но я предполагаю, что «Thread.sleep» упростил время выполнения, чтобы переключиться на EDT, чтобы сделать рисунок, а это значит, что это произойдет почти сразу. – cHao
Согласитесь с первым комментарием, но я подозреваю, что есть еще одна проблема. Можете ли вы опубликовать код DrawLineTask. –
Спасибо за ваши ответы. Как вы можете видеть выше, код чертежа очень прост, и даже если он был каким-то образом вычислительным, EDT может немного замедлить, но он все равно будет рисовать линии. – freakii