web-dev-qa-db-de.com

über das Zeichnen eines Polygons in Java

hallo, ich versuche mich über Java2D zu verbessern und zuallererst beschäftige ich mich mit dem Zeichnen von Polygonen. Ich kann das Polygon jedoch nicht auf dem Rahmen sehen. Ich habe einige Tutorials und Beispiele gelesen, aber wie gesagt, ich habe Probleme. Hier ist der Beispielcode zum Zeichnen eines Polygons.

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 hat keine paintComponent(Graphics g) -Methode. Fügen Sie die Annotation @Override hinzu, und Sie erhalten einen Fehler beim Kompilieren.

1) Verwenden Sie JPanel und überschreiben Sie paintComponent (Sie würden dann JPanel zum JFrame-Viad JFrame#add(..) hinzufügen).

2) Überschreiben Sie getPreferredSize(), um korrekte Dimensions zurückzugeben, die zu Ihrer Zeichnung in das Graphics-Objekt passen. Andernfalls werden sie nicht als JPanel-Größe ohne Komponenten angesehen

3) Rufen Sie nicht setSize für JFrame... auf. Verwenden Sie stattdessen eine korrekte LayoutManager und/oder überschreiben Sie getPrefferedSize() und rufen Sie pack() für JFrame auf, nachdem Sie alle Komponenten hinzugefügt, jedoch nicht sichtbar gemacht haben

4) Lesen Sie über Concurrency in Swing speziell über Event Dispatch Thread

5) Das Klassennamensschema der Klasse sollte mit einem Großbuchstaben beginnen und danach sollte jeder erste Buchstabe eines neuen Wortes groß geschrieben werden

6) Auch Sie extend JFrame und haben eine Variable JFrame? Nehmen Sie den extend JFrame weg und behalten Sie die Variable JFrame, da wir nicht wollen, dass 2 JFrames JFrames erweitert wird

Hier ist Ihr Code mit obigen Korrekturen (entschuldigen Sie die Bildqualität, mussten aber die Größe ändern oder es ging auf 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();
            }
        });
    }
}

Wie in Ihrem Kommentar:

ich bereite eine Karte vor, die viele Polygone und gestern i .__ enthält. Ich benutzte ein JPanel über einem JFrame und ich versuchte zu überprüfen, ob sich die Maus in .__ befand. des Polygons mit MouseListener. Später sah ich, dass der mouseListener .__ gab. false antwortet (wie die Maus sich nicht innerhalb des Polygons befindet, aber sie wirkt als wäre sie innerhalb des Polygons). also habe ich die JPanel gelöscht und dann hat funktioniert

Hier wird der Code mit MouseAdapter aktualisiert und mouseClicked überschrieben, um zu überprüfen, ob sich der Klick innerhalb des Polygons befindet.

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 erweitert JComponent nicht, überschreibt also nicht paintComponent. Sie können dies überprüfen, indem Sie die Annotation @Override hinzufügen. 

Um diese Funktionalität zu erhalten, extrahieren Sie paintComponent in eine neue Klasse, die JComponent erweitert. Vergessen Sie nicht, super.paintComponent(g) statt super.paintComponents(g) aufzurufen.

3
Reimeus

Ersetzen 

protected void paintComponent(Graphics g){

    super.paintComponents(g);

    g.setColor(Color.BLUE);
    g.drawPolygon(poly);

}   

Mit

protected void Paint(Graphics g){

    super.Paint(g);

    g.setColor(Color.BLUE);
    g.drawPolygon(poly);

}  
0
christopher