在Jcomponent

时间:2016-09-28 16:53:52

标签: java swing repaint jcomponent

我想在2D平面视图中绘制一个移动光标(绿色)(红色)。我使用操纵杆来命令它。

要访问红色面板,我必须按照以下方案从控制器获取组件的组件: 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
    }
}

修改 我忘了准确说我只是使用了sweetHome3D Api,因为我正在创建一个插件,我无法修改原始代码。

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

1 个答案:

答案 0 :(得分:-2)

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

为避免这种情况,您可以使用“双缓冲区”,在隐藏图像中绘制新图像,然后在准备就绪时直接在UI中替换。

可以在oracle doc page

中找到一个很好的解释

stackoverflow: double buffering in java SWING

中的示例