Движущаяся ничья на 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