Dessine un Rectangle dans JFrame ne fonctionne pas
J'ai ce bout de code qui est censé dessiner un rectangle sur un JFrame
mais quand je lance le programme sur Eclipse, il ouvre juste le cadre, mais ne permet pas de tracer le cercle sur elle.
Voici le code:
import javax.swing.*;
import java.awt.*;
public class Infout {
Infout(){
JFrame frame = new JFrame();
frame.setSize(300, 400);
frame.setTitle("An Empty Frame");
frame.setDefaultCloseOperation(3);
frame.setVisible(true);
}
public static void main(String[] args) {
//TODO Auto-generated method stub
Infout m = new Infout();
m.paint(null);
}
public void paint(Graphics g)
{
g.drawRect(5, 5, 105, 105);
}
}
Quelqu'un peut-il me dire pourquoi il ne fonctionne pas correctement?
Lorsque vous appelez la méthode de peinture
[Voir ce lien] stackoverflow.com/questions/9713432/...
+1 Pour l'affichage de votre question avec un valide SSCCE.
[Voir ce lien] stackoverflow.com/questions/9713432/...
+1 Pour l'affichage de votre question avec un valide SSCCE.
OriginalL'auteur AbSaintDane | 2014-03-14
Vous devez vous connecter pour publier un commentaire.
Je crois que ce que vous cherchez à faire est d'appeler
frame.repaint();
à la place. Ce n'est toujours pas résoudre votre problème, cependant, parce que votrepaint()
méthode n'est pas réellement de la substitution de laJFrame
'spaint()
méthode parce que votre classe ne s'étend pasJFrame
, c'est juste la création d'unJFrame
dans le constructeur.Ainsi, vous pouvez soit faire à la dernière minute remplacer et déplacer votre méthode de peinture dans le fait que (comme par polypiel de réponse), ou (personnellement, je pense que plus d'éloquence), vous pouvez avoir votre classe étendre JFrame, comme;
Comme d'autres l'ont souligné cependant
paintComponent()
est un meilleur choix de de remplacer, et vous devriez vous rappeler de faire un appel àsuper()
au début de la nouvelle méthode redéfinie. Vous devrez alors créer un nouveauJPanel
à mettre à l'intérieur de votreJFrame
parce queJFrame
ne dispose pas d'unpaintComponent()
méthode pour remplacer la.Pour ce faire, vous pouvez supprimer votre
paint()
méthode de votre classe entièrement et ajoutez la dernière minute remplacer dans votre constructeur:Pour l'extensibilité et de la bonne orientée objet design cependant, vous pourriez être mieux dans le long terme de la définition de votre propre
JPanel
sous-classe et en remplaçant lapaintComponent(Graphics)
méthode. Désolé pour les indécis, j'espère que cette aide.paintComponent()
deJComponent
avec l'appel desuper()
méthode.Un problème à la fois, ils coopérative doit comprendre ce qu'ils ont fait de mal et pourquoi leur code actuel ne fonctionne pas la première. Je vais modifier ma réponse à suggérer que paintComponent() est un meilleur choix de de remplacer.
Si l'OP n'est pas demander à ce sujet, vous avez besoin de lui suggérer d'utiliser de meilleur moyen pour éviter les problèmes dans l'avenir.
Ajouter un exemple avec paintComponent et j'ai' ll vous donner des voix.
jusqu'votes;)
OriginalL'auteur Rudi Kershaw
Vous avez réussi à briser complètement la peinture de la chaîne en appelant le:
Il devrait être:
Comme un résultat d'un appel à
repaint()
, lepaint(Graphics)
méthode sera appelée automatiquement, mais avec un valide objet graphique.Noter qu'il est généralement préférable de remplacer la
paintComponent(Graphics)
méthode deJPanel
qui est ajouté à uneJFrame
(ou une fenêtre, ou une applet ou une boîte de dialogue..).La chose à faire lors de la substitution ou l'autre méthode, c'est d'appeler la méthode super avant de faire quelque chose d'autre.
OriginalL'auteur Andrew Thompson
Le doit remplacer la méthode de peinture de la
JFrame
. Une méthode de peinture dansInfout
est inutile.frame.setDefaultCloseOperation(3);
" Ne pas utiliser des numéros de magie quand il y a des constantes définies.C'est pourquoi le @Override annotation est utile
La peinture Custom doivent être exécutés à
paintComponent()
deJComponent
avec l'appel desuper()
méthode.OriginalL'auteur polypiel
Ne pas appeler à la peinture à l'externe et à l'appel de la super.de la peinture dans votre paint() de la méthode.
et supprimer m.peinture(null).
paintComponent()
deJComponent
avec l'appel desuper()
méthode.OriginalL'auteur Shriram