Движущаяся ничья на Jcomponent

Я хочу нарисовать движущийся курсор (зеленым цветом) в моем 2D-плане (красным цветом) . Я использую джойстик для управления им.

Чтобы получить доступ к красной панели, я должен получить компоненты компонентов из контроллера по следующей схеме: JPanel => JScrollPane => JViewPort => PlanComponent (расширяет JComponent)

Мои координаты курсора постоянно обновляются при чтении сокета. Когда координаты изменяются, он вызывает функцию drawCross.

Мой курсор отлично перемещается джойстиком, но красная область мигает, а курсор мигает больше.

Цветной скриншот программы

 public ThreadGestionObjetImu(Home home, HomeController homeController) {
    _sweetHome3dHomeControllerVar = homeController;
    _jComponentLayer1 = (MultipleLevelsPlanPanel) _sweetHome3dHomeControllerVar.getPlanController().getView();
    _jComponentLayer2 = (JPanel) _jComponentLayer1.getComponent(1);
    _jComponentLayer3 = (JScrollPane) _jComponentLayer2.getComponent(0);
    _jComponentLayer4 = (JViewport) _jComponentLayer3.getComponent(0);
    _planComponent = (PlanComponent) _jComponentLayer4.getComponent(0);
}


public void update(Observable o, Object arg) {
    //parsing socket signal
    switch(XImuPlugin.state){
        case PLAN:
            drawCross();
            break;
    }
}



public void drawCross() {
    _planComponent.getGraphics().drawLine(_crossPositionX + _intImuValueX, _crossPositionY + 25 + _intImuValueY, _crossPositionX + 50 + _intImuValueX, _crossPositionY + 25 + _intImuValueY);
    _planComponent.getGraphics().drawLine(_crossPositionX + 25 + _intImuValueX, _crossPositionY + _intImuValueY, _crossPositionX + 25 + _intImuValueX, _crossPositionY + 50 + _intImuValueY);

    if (_intImuValueX > 1 || _intImuValueX < -1 || _intImuValueY > 1 || _intImuValueY < -1) {
        _planComponent.update(_planComponent.getGraphics());
        // I tried update, repaint, updateUI and all the possible functions
    }
}

РЕДАКТИРОВАТЬ: я забыл уточнить, что я застрял только с использованием SweetHome3D Api, потому что я создаю плагин, я не могу изменить оригинальный код.

Проблема решена с помощью _planComponent.add(MyComponent); Я создал JComponent с переопределением paintComponent.

1 ответ

Решение

Это известная проблема, если вы рисуете компонент, уже находящийся в пользовательском интерфейсе, результатом является мигание (компонент рисует свой цвет фона, а затем рисует изображение).

Чтобы избежать этого, вы можете использовать "двойной буфер", рисуя новое изображение в скрытом изображении, а затем, когда оно будет готово, заменяйте непосредственно в вашем пользовательском интерфейсе.

Хорошее объяснение можно найти на странице оракула.

И пример здесь в stackru: двойная буферизация в Java SWING

Другие вопросы по тегам