在 Jcomponent 上移动绘制

Moving draw on Jcomponent

我想在二维平面图(红色)中绘制一个移动光标(绿色)。我用摇杆来指挥它

要访问红色面板,我必须按照以下方案从控制器中获取组件的组件: JPanel => JScrollPane => JViewPort => PlanComponent(扩展 JComponent)

我的光标坐标通过读取套接字不断更新。 当坐标改变时,它调用drawCross函数。

我的光标被操纵杆完美移动,但红色区域闪烁,光标闪烁更多。

Coloured program screenshot

 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
    }
}

编辑: 忘记说清楚了,我一直卡在只用sweetHome3DApi,因为我是做插件的,不能修改原代码

使用 _planComponent.add(MyComponent) 解决了问题; 我创建了一个覆盖了 paintComponent 的 JComponent。

这是一个已知问题,如果你在 UI 中绘制一个组件,结果就是这个闪烁(组件绘制他的背景颜色,然后绘制图像)。

为避免这种情况,您可以使用 "double buffer",在隐藏图像中绘制新图像,然后在准备就绪后直接替换为 UI。

可以在 oracle doc page

中找到很好的解释

这里有一个例子 Whosebug: double buffering in java SWING