о рисовании многоугольника в java

Привет, я пытаюсь улучшить себя о java2D и, прежде всего, я имею дело с рисованием полигонов. Однако я не вижу многоугольник на кадре. Я читал некоторые учебники и примеры, но как я сказал, я сталкиваюсь с проблемами. вот пример кода рисования многоугольника;

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

    }

}

3 ответов


JFrame нет paintComponent(Graphics g) метод. Добавьте @Override аннотации и вы получите ошибку времени компиляции.

1) Использовать JPanel и заменить paintComponent (ты бы не добавить JPanel до JFrame виад JFrame#add(..))

2) переопределить getPreferredSize() чтобы вернуть правильный Dimensions, которые соответствуют вашему рисунку на графическом объекте, иначе они не будут рассматриваться как JPanel размер без компонентов 0,0

3) не называют setSize on JFrame... скорее используйте правильный LayoutManager и/или переопределить getPrefferedSize() и звонок pack() on JFrame после добавления всех компонентов, но перед установкой его видно

4) прочтите на параллелизм в Swing конкретно про Поток Отправки Событий

5) схема именования классов watch должна начинаться с заглавной буквы, и каждая первая буква нового слова после этого должна быть заглавной

6) Также вы extend JFrame и переменная JFrame? Уберите extend JFrame и сохранить JFrame переменная, поскольку мы не хотим 2 JFrames и его не хорошая практика для расширения JFrame если не добавлять функциональность

вот ваш код с вышеуказанными исправлениями (извините качество изображения, но пришлось изменить размер или он собирался 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();
            }
        });
    }
}

согласно вашему комментарию:

я готовлю карту, которая включает в себя много полигонов и вчера я используется для jpanel над JFrame, и я попытался проверить, была ли мышь внутри многоугольника с MouseListener. позже я увидел, что mouseListener дал false отвечает (например, мышь не находится внутри полигона, но она действует как будто это было внутри многоугольника). поэтому я удалил JPanel, а затем он работал

вот обновленный код с MouseAdapter и переопределить mouseClicked чтобы проверить, был ли клик внутри полигона.

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 не распространяется JComponent поэтому не переопределяет paintComponent. Вы можете проверить это, добавив @Override Примечание.

чтобы получить эту функцию извлечения paintComponent к новому классу, который расширяет JComponent. Не забудьте позвонить super.paintComponent(g), а не super.paintComponents(g).


заменить

protected void paintComponent(Graphics g){

    super.paintComponents(g);

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

}   

С

protected void paint(Graphics g){

    super.paint(g);

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

}