2011-08-25 4 views
2

J'ai un JPanel sur lequel un dessin est effectué en utilisant la méthode paintComponent et après cela quand un utilisateur clique sur le JPanel une chaîne est dessinée (ou n'importe quel dessin) dessus et comme l'utilisateur se déplace souris sur le JPanel il montre les coordonnées dans l'info-bulle du JPanel.le texte de l'info-bulle efface le dessin de l'écran en Java

1) Le problème est que lorsque l'info-bulle survole la chaîne dessinée, elle l'efface mais ce tooltiptext n'a pas d'effet d'effacement sur la partie de dessin que j'ai effectuée dans la méthode paintComponent. Je ne suis pas capable de comprendre pourquoi cela se passe.

2) Et aussi quand je dessine une chaîne sur clic puis que je minimise et restaure mon application, mes chaînes dessinées ont disparu.

J'espère que vous comprenez ce que je veux dire.

Voici le code:

@Override 
public void paintComponent(Graphics graphics) { 
    super.paintComponent(graphics); 
    Graphics2D graphics2D = (Graphics2D) graphics; 
    graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 

    drawBorder(graphics2D); 
    drawGrid(graphics2D); 
} 

private void drawBorder(Graphics2D graphics2D) { 
    graphics2D.setColor(Color.ORANGE); 
    graphics2D.setStroke(new BasicStroke(borderStroke)); 
    graphics2D.drawRoundRect(panelStartLoc.x, panelStartLoc.y, panelBorder.width, 
      panelBorder.height, borderRoundness, borderRoundness); 
} 

private void drawGrid(Graphics2D graphics2D) { 
    graphics2D.setColor(Color.ORANGE); 
    graphics2D.setStroke(new BasicStroke(gridCellStroke)); 

    for (int row = gridStartLoc.x; row < panelBorder.getWidth(); row += cellWidth + cellHorGap) { 
     for (int col = gridStartLoc.y; col < panelBorder.getHeight(); col += cellHeight + cellVerGap) { 
      graphics2D.drawRoundRect(row, col, cellWidth, cellHeight, cellRoundness, cellRoundness); 
     } 
    } 
} 

public void drawSubjectAtClickLoc(int subjectCode) { 
    Color color = getBackground(); 
    String drawString = null; 
    int subjectDrawXLoc = cellClickLoc.x + 4; 
    int subjectDrawYLoc = (cellClickLoc.y + cellHeight) - 3; 
    Graphics2D graphics2D = (Graphics2D) getGraphics(); 

    if (subjectCode == SUBJECT_CLEAR) { 
     graphics2D.setColor(getBackground()); 
     graphics2D.fillRoundRect(cellClickLoc.x + 2, cellClickLoc.y + 2, cellWidth - 4, 
       cellHeight - 4, cellRoundness, cellRoundness); 
     return; 
    } 
    if (subjectCode == SUBJECT_HUMAN) { 
     color = Color.WHITE; 
     drawString = "H"; 
    } 
    if (subjectCode == SUBJECT_RESOURCE) { 
     color = Color.GREEN; 
     drawString = "R"; 
    } 

    graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
    graphics2D.setFont(new Font(null, Font.BOLD, 26)); 
    graphics2D.setColor(color); 
    graphics2D.drawString(drawString, subjectDrawXLoc, subjectDrawYLoc); 
} 

.... Merci à l'avance

Répondre

3

Lorsque votre écran est couvert, Java appelle paintComponent() pour fixer l'écran. Si vous dessinez en dehors de la méthode paintComponent(), lorsque l'écran est réparé, vos dessins supplémentaires seront effacés.

Donc, ne faites pas comme ça: faites tout votre dessin en paintComponent(). Lorsque l'utilisateur clique quelque part, ajoutez la chaîne que vous voulez dessiner et les coordonnées à une structure de données quelconque (c'est-à-dire, une liste d'objets, chaque objet contenant une chaîne et quelques coordonnées), puis appelez repaint(). Dans votre méthode paintComponent(), examinez cette structure de données et dessinez les chaînes.

+0

donc je peux dire que les applications de dessin maintiennent une structure de données des objets dessinés dans la mémoire .. est-ce le cas? –

+0

Oui, c'est vrai. –

+0

merci beaucoup ... –

Questions connexes