在 Jcomponent 上移动绘制
Moving draw on Jcomponent
我想在二维平面图(红色)中绘制一个移动光标(绿色)。我用摇杆来指挥它
要访问红色面板,我必须按照以下方案从控制器中获取组件的组件:
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
}
}
编辑:
忘记说清楚了,我一直卡在只用sweetHome3DApi,因为我是做插件的,不能修改原代码
使用 _planComponent.add(MyComponent) 解决了问题;
我创建了一个覆盖了 paintComponent 的 JComponent。
这是一个已知问题,如果你在 UI 中绘制一个组件,结果就是这个闪烁(组件绘制他的背景颜色,然后绘制图像)。
为避免这种情况,您可以使用 "double buffer",在隐藏图像中绘制新图像,然后在准备就绪后直接替换为 UI。
可以在 oracle doc page
中找到很好的解释
这里有一个例子 Whosebug: double buffering in java SWING
我想在二维平面图(红色)中绘制一个移动光标(绿色)。我用摇杆来指挥它
要访问红色面板,我必须按照以下方案从控制器中获取组件的组件: 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
}
}
编辑: 忘记说清楚了,我一直卡在只用sweetHome3DApi,因为我是做插件的,不能修改原代码
使用 _planComponent.add(MyComponent) 解决了问题; 我创建了一个覆盖了 paintComponent 的 JComponent。
这是一个已知问题,如果你在 UI 中绘制一个组件,结果就是这个闪烁(组件绘制他的背景颜色,然后绘制图像)。
为避免这种情况,您可以使用 "double buffer",在隐藏图像中绘制新图像,然后在准备就绪后直接替换为 UI。
可以在 oracle doc page
中找到很好的解释这里有一个例子 Whosebug: double buffering in java SWING