我想在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)解决问题; 我创建了一个覆盖paintComponent的JComponent。
答案 0 :(得分:-2)
这是一个已知的问题,如果您在UI中已经绘制了一个组件,结果就是这个闪烁(组件绘制他的背景颜色,然后绘制图像)。
为避免这种情况,您可以使用“双缓冲区”,在隐藏图像中绘制新图像,然后在准备就绪时直接在UI中替换。
中找到一个很好的解释 中的示例