salut j'essaye de m'améliorer sur Java2D et tout d'abord je traite avec des polygones de dessin Cependant, je ne peux pas voir le polygone sur le cadre. J'ai lu des tutoriels et des exemples, mais comme je l'ai dit, je suis confronté à des problèmes. Voici l'exemple de code pour dessiner un polygone;
import Java.awt.Color;
import Java.awt.Graphics;
import Java.awt.Polygon;
import javax.swing.JFrame;
public class jRisk extends JFrame {
private JFrame mainMap;
private Polygon poly;
public jRisk(){
initComponents();
}
private void initComponents(){
mainMap = new JFrame();
mainMap.setSize(800, 600);
mainMap.setResizable(false);
mainMap.setVisible(true);
mainMap.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int xPoly[] = {150,250,325,375,450,275,100};
int yPoly[] = {150,100,125,225,250,375,300};
poly = new Polygon(xPoly, yPoly, xPoly.length);
}
protected void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
/**
* @param args
*/
public static void main(String[] args) {
new jRisk();
}
}
JFrame
n'a pas de paintComponent(Graphics g)
méthode. Ajoutez l'annotation @Override
et vous obtiendrez une erreur de compilation.
1) Utilisez JPanel
et remplacez paintComponent
(vous ajouteriez alors JPanel
à la JFrame
viad JFrame#add(..)
)
2) Remplacez getPreferredSize()
pour renvoyer les correctes Dimension
s qui correspondent à votre dessin sur l’objet Graphics, sinon elles ne seront pas considérées comme JPanel
taille sans composants est 0,0
3) n’appelez pas setSize
sur JFrame
... utilisez plutôt une LayoutManager
et/ou une substitution correcte getPrefferedSize()
et appelez pack()
sur JFrame
après avoir ajouté tous les composants mais avant de la définir
4) Avoir une lecture Concurrence dans Swing spécifiquement sur Thread Dispatch Event
5) le schéma de nommage des classes de surveillance doit commencer par une lettre majuscule et chaque première lettre d'un nouveau mot doit ensuite être mise en majuscule
6) Vous aussi extend JFrame
et avez une variable JFrame
? Supprimez le extend JFrame
et conservez la variable JFrame
car nous ne voulons pas 2 JFrame
s et il n’est pas recommandé d’étendre JFrame
à moins d’ajouter des fonctionnalités.
Voici votre code avec les corrections ci-dessus (excusez la qualité d'image mais vous deviez le redimensionner, sinon elle passait à 800x600):
import Java.awt.Color;
import Java.awt.Dimension;
import Java.awt.Graphics;
import Java.awt.Polygon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class JRisk {
private JFrame mainMap;
private Polygon poly;
public JRisk() {
initComponents();
}
private void initComponents() {
mainMap = new JFrame();
mainMap.setResizable(false);
mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
int xPoly[] = {150, 250, 325, 375, 450, 275, 100};
int yPoly[] = {150, 100, 125, 225, 250, 375, 300};
poly = new Polygon(xPoly, yPoly, xPoly.length);
JPanel p = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
};
mainMap.add(p);
mainMap.pack();
mainMap.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JRisk();
}
});
}
}
Selon votre commentaire:
je prépare une carte qui comprend beaucoup de polygones et hier, je utilisé un JPanel sur un JFrame et j'ai essayé de vérifier si la souris était à l'intérieur du polygone avec MouseListener. plus tard, j'ai vu que mouseListener avait donné false répond (comme si la souris ne se trouvait pas à l'intérieur du polygone mais qu'elle agissait comme si elle se trouvait à l'intérieur du polygone). donc j'ai supprimé le JPanel et puis il travaillé
Voici un code mis à jour avec MouseAdapter
et remplacé mouseClicked
pour vérifier si click était dans le polygone.
import Java.awt.Color;
import Java.awt.Dimension;
import Java.awt.Graphics;
import Java.awt.Polygon;
import Java.awt.event.MouseAdapter;
import Java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class JRisk {
private JFrame mainMap;
private Polygon poly;
public JRisk() {
initComponents();
}
private void initComponents() {
mainMap = new JFrame();
mainMap.setResizable(false);
mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
int xPoly[] = {150, 250, 325, 375, 450, 275, 100};
int yPoly[] = {150, 100, 125, 225, 250, 375, 300};
poly = new Polygon(xPoly, yPoly, xPoly.length);
JPanel p = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
};
MouseAdapter ma = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
super.mouseClicked(me);
if (poly.contains(me.getPoint())) {
System.out.println("Clicked polygon");
}
}
};
p.addMouseListener(ma);//add listener to panel
mainMap.add(p);
mainMap.pack();
mainMap.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JRisk();
}
});
}
}
JFrame
ne s'étend pas JComponent
donc ne remplace pas paintComponent
. Vous pouvez vérifier cela en ajoutant l'annotation @Override
.
Pour obtenir cette fonctionnalité, extrayez paintComponent
dans une nouvelle classe qui étend JComponent
. N'oubliez pas d'appeler super.paintComponent(g)
plutôt que super.paintComponents(g)
.
Remplacer
protected void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
Avec
protected void Paint(Graphics g){
super.Paint(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}