web-dev-qa-db-fra.com

sur dessiner un polygone en java

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();

    }

}
8
quartaela

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 Dimensions 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 JFrames 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):

enter image description here

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();
            }
        });
    }
}
14
David Kroukamp

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).

3
Reimeus

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);

}  
0
christopher