Не получается добавить PaintListener к Canvas в SWT

127
12 декабря 2020, 02:00

Начинаю дебажить этот кусок кода

 public void redrawGraphic(Function func, int color){
        canvas.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                Rectangle clientArea = canvas.getClientArea();
                e.gc.setLineWidth(1);
                e.gc.setForeground(e.display.getSystemColor(color));
                for (int currFunc = 0; currFunc < func.size() - 1; currFunc++) {
                    if ((int)Math.round(abs(func.getPoint(currFunc).y)) 
                            <= clientArea.height/LINES_SPACE*currScale/2 + currPixelsCenterX + 1) {
                        int key0 = (int)Math.round(func.getPoint(currFunc).x 
                                / currScale * LINES_SPACE) + clientArea.width / 2;
                        int value0 = -(int)Math.round(func.getPoint(currFunc).y 
                                / currScale * LINES_SPACE) + clientArea.height / 2;
                        int key1 = (int)Math.round(func.getPoint(currFunc + 1).x 
                                / currScale * LINES_SPACE) + clientArea.width / 2;
                        int value1 = -(int)Math.round(func.getPoint(currFunc + 1).y 
                                / currScale * LINES_SPACE) + clientArea.height / 2;
                        e.gc.drawLine(key0 - currPixelsCenterX,  value0 + currPixelsCenterY,
                                key1 - currPixelsCenterX, value1 + currPixelsCenterY);
                    }
                }
            }
        });
    }

При step over перескакивает через блок

new PaintListener() {}

При step into в переменных у canvas пишет "No such instance field: 'canvas' ", хотя это поле проинициализированно. Если убрать все содержимое блока -- результат тот же.

У меня есть подозрение, что виновата синхронизация.

public void drawNewPoint(){
        Display.getDefault().asyncExec(new Runnable () {
            public void run() {
                lock.lock();
                try {
                    while (model.isReadyToDraw) {
                        condition.await();
                    }
                    Thread.sleep(model.getMsSleepTime());
                    model.isReadyToDraw = true;
                    System.out.println(model.sharedPoint.x + " " + model.sharedPoint.y);
                    model.addSharedLinearPoint();
//вот тут вызываю метод, листинг которого выше
                    graphicsController.redrawGraphic(model.getLinearFunction(), SWT.COLOR_GREEN); 
                    condition.signalAll();
                } catch (InterruptedException e) {
                    System.out.println(e.getMessage());
                } finally {
                    lock.unlock();
                }
            }
        });
    }

Метод выше выполняется в классе, который реализует Runnable, где синхронизируется с другим потоком, осуществляющим вычисления.

В чем же причина?

READ ALSO
Работа с коллекциями, stream API

Работа с коллекциями, stream API

Тут в консоль выводятся слова длинна которых больше 4-ёхКак можно изменить условие,чтобы выводилась слово с максимальной длинной ?

119
Проблемы с импортом из maven local

Проблемы с импортом из maven local

Я установил джарник с нужной мне библиотекой в maven local следующей командой:

87
hibernate mapping xml добавление в таблицу

hibernate mapping xml добавление в таблицу

Допустим у меня есть Два объекта : Пенал и ручка в пенале может содержаться большое количество ручек представим бд с двумя таблицами: Код:

97