2016-09-28 3 views
-2

Je souhaite dessiner un curseur mobile (en vert) dans ma vue en plan 2D (en rouge). J'utilise un joystick pour le commander.Déplacer le dessin sur Jcomponent

Pour accéder au panneau rouge que je dois obtenir des composants des composants du contrôleur suivant ce schéma: JPanel => JScrollPane => JViewPort => PlanComponent (étend JComponent)

Mes coordonnées du curseur sont continuellement mis à jour par lire une socket. Lorsque les coordonnées sont modifiées, il appelle la fonction drawCross.

Mon curseur est parfaitement déplacé par le joystick mais la zone rouge clignote et le curseur clignote davantage.

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

EDIT: J'ai oublié de préciser que je coincé dans seulement en utilisant la sweethome3d Api parce que je suis la création d'un plug-in, je ne peux pas modifier le code original.

Problème résolu en utilisant _planComponent.add (MyComponent); J'ai créé un composant JComponent avec un remplacement de paintComponent.

+1

S'il vous plaît simplifier votre problème et votre code en créant et en affichant un approprié [mcve]. –

+0

'_planComponent.getGraphics()' qui semble suspect .. En savoir plus lorsque le MCVE suggéré par @HovercraftFullOfEels est posté. –

+0

Essayé d'être plus clair, n'hésitez pas à demander des détails. – Mfaure

Répondre

-2

Il s'agit d'un problème connu, si vous dessinez un composant déjà dans l'interface utilisateur, le résultat est ce clignotement (le composant dessinant sa couleur d'arrière-plan, puis dessinant l'image). Pour éviter cela, vous pouvez utiliser un "double tampon", en dessinant la nouvelle image dans une image de cache et ensuite, quand il est prêt, remplacez directement dans votre interface utilisateur.

Une bonne explication peut être trouvée dans oracle doc page

Et un exemple ici stackoverflow: double buffering in java SWING

+3

Swing est double buffered par défaut. Le problème est l'utilisation de la méthode getGraphics(). N'utilisez pas getGraphcis(). La peinture personnalisée est effectuée en remplaçant la méthode 'paintComponent (...)'. – camickr