2010-09-15 4 views
2

Je voudrais pouvoir peindre Image s sur un JFrame, mais chaque fois que je veux (pas dans laComment dessiner des graphiques en dehors de la fonction de la peinture() dans un JFrame

méthode JFrame.paint.

Pour le projet I je travaille, j'ai un class Bullseye extends BufferedImage, et essaie de le mettre sur un JFrame.

class DrawingFrame extends JFrame { 
    public void drawImage(Image img, int x, int y) { 
     getGraphics().drawImage(img,x,y,null); 
     repaint(); 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     DrawingFrame frame = new DrawingFrame(); 
     Bullseye bullseye = new Bullseye(20,20); //width,height 

     // later 
     frame.setVisible(true); 
     frame.drawImage(bullseye,10,20); 
     frame.drawImage(bullseye,20,20); 
     frame.drawImage(bullseye,30,20); 
    } 
} 

Cependant, rien n'apparaît après quelques recherches, apparemment, cela ne fonctionne pas parce que les modifications apportées à l'objet graphics obtenir effacé lorsque je repaint()

Comment est-ce que je peux faire ceci? Est-ce la même approche?

+0

puis-je vous demander pourquoi pas dans la peinture? – mhshams

+0

Parce que je veux ajouter arbitrairement 'Images' en externe. Une fois que j'ai surchargé 'paint', je couple étroitement le' JFrame' au 'Images' que je veux ajouter. –

Répondre

1

Dessiner à l'écran en Java est (presque) toujours fait dans paint(). Qu'est-ce que vous avez besoin pour votre classe est:

class DrawingFrame extends JFrame { 

    private Image bullseye = new Bullseye(20,20); //width,height 


    public void paint(Graphics g) { 
     g.drawImage(bullseye,10,20); 
     g.drawImage(bullseye,20,20); 
     g.drawImage(bullseye,30,20); 
    } 

} 

class Main { 
    public static void main(String[] args) { 
     DrawingFrame frame = new DrawingFrame(); 

     // later 
     frame.setVisible(true); 
    } 
} 

Si vous devez activer le dessin de bullseyes à un moment précis, créez un drapeau sur l'objet DrawingFrame et mettez-le lorsque vous en avez besoin. Vous devrez appeler repaint() lorsque le drapeau est défini.

4

Je pense que vous prenez le problème en arrière. Dans Swing, toutes les opérations de dessin doivent être effectuées dans la méthode paint(). Ce que vous pouvez faire est de stocker l'image que vous voulez dessiner comme attribut dans votre classe, puis, dans votre méthode de douleur, dessiner l'image où vous voulez. Par exemple:

class MyFrame extends JFrame { 

    Image image; 

    public void paint(Graphics g) { 
     super.paint(g); 
     if (image != null) { 
      g.drawImage(image, /* ... */); 
     } 
    } 

    public void setImage(Image image) { 
     this.image = image; 
     repaint(); 
    } 

} 

Et dans l'autre classe:

myFrame.setImage(myImage); 
+0

Le problème avec ceci est que je veux pouvoir ajouter beaucoup d'images à diverses coordonnées (x, y). Avec cette méthode, je ne peux en faire qu'un. Je pourrais faire en sorte qu'il "fasse la queue" des images pour peindre à certaines coordonnées lors du prochain appel de peinture, mais cela semble exagéré. –

+2

Si vous voulez plus d'images, vous pouvez remplacer l'attribut 'image' par un' Liste '. Mais si vous voulez dessiner directement dans un JFrame, vous devez surcharger la méthode 'paint()'. –

1

Que diriez-vous de créer une image hors écran à peindre sur à l'extérieur de la peinture proprement dite, puis la peinture réelle juste peint l'image offscreen réelles graphique? Un double tampon?

1

La peinture personnalisée devrait rarement être faite dans la méthode paint(), en particulier la méthode paint() d'un JFrame. La peinture personnalisée est effectuée en remplaçant la méthode paintComponent() d'un composant Swing, généralement un composant JComponent ou JPanel. Lisez la section du tutoriel Swing sur Custom Painting pour plus d'informations et des exemples de travail.

Cependant, dans ce cas, vous n'avez pas besoin d'effectuer de peinture personnalisée. Vous créez simplement un ImageIcon et ajoutez l'icône à un JLabel, puis vous ajoutez le JLabel à un panneau. Lisez la section du tutoriel Swing sur How to Use Icons pour des exemples de travail.

Si vous ne pouvez pas trouver le gestionnaire de disposition approprié à utiliser, vous pouvez également utiliser le positionnement absolu. Encore une fois, vous trouverez une section dans le tutoriel sur l'utilisation des gestionnaires de disposition qui explique cela plus en détail.

1

Créez un objet graphique dans votre classe, pour lequel il doit avoir une existence globale et pas seulement locale.

public class Graphics2D freefrompaint = null; 

Puis aussi un booléen à des fins flux de contrôle:

private boolean heypaintreturnnow = false; 

et passer outre l'objet de la méthode de mise à jour de la superclasse Component Swing() asfollows:

public void update(Graphics g) { 
    if (heypaintreturnnow) return; 
    freefrompaint = (Graphics2D)g; 
    heypaintreturnnow = true; /*and if you want, do => super.update(?) once, or once after boolean hereof is set to false by your code. */ 

Update() efface toutes les couleurs d'un tampon de données graphiques hors écran à la couleur d'arrière-plan actuelle de GraphicsObject. Et, vous devez également connaître les trois méthodes exactes effectuées à l'intérieur de paint():

(1) il appelle son propre paintComponent(), c'est ici que la peinture réelle de ce composant est déléguée; 2) la méthode peignant ses bordures; et enfin est la peinture de son composant enfant. Une dernière chose très importante et inévitable: utiliser une classe, imbriquée, nommée ou anonyme, avec cette méthode Conteneur substituée. Et passez cette classe à la méthode setContentPane (Container actualgraphicsreference) de JFrame; c'est un must. J'espère avoir rendu mon approche explicative et informative sans ambiguïté. De manière explicative, vous pouvez maintenant utiliser freefrompaint pour peindre au-delà, et l'appel du système d'exploitation à la repaint de votre Frame() n'invoquera pas une opération d'effacement par défaut "twin Graphics", que vous avez supprimée instruit et recommande à vous. Merci pour une opportunité expressive.

Questions connexes