about drawing a Polygon in java

前端 未结 3 688
生来不讨喜
生来不讨喜 2020-12-06 18:20

hi there i\'m trying to improve myself about java2D and first of all i\'m dealing with drawing polygons. However, i can not see the polygon on frame. I read some tutorials a

相关标签:
3条回答
  • 2020-12-06 18:26

    JFrame does not have a paintComponent(Graphics g) method. Add the @Override annotation and you will get a compile time error.

    1) Use JPanel and override paintComponent (you would than add JPanel to the JFrame viad JFrame#add(..))

    2) Override getPreferredSize() to return correct Dimensions which fit your drawing on Graphics object or else they wont be seen as JPanel size without components is 0,0

    3) dont call setSize on JFrame... rather use a correct LayoutManager and/or override getPrefferedSize() and call pack() on JFrame after adding all components but before setting it visible

    4) Have a read on Concurrency in Swing specifically about Event Dispatch Thread

    5) watch class naming scheme should begin with a capital letter and every first letter of a new word thereafter should be capitalized

    6) Also you extend JFrame and have a variable JFrame? Take away the extend JFrame and keep the JFrame variable as we dont want 2 JFrames and its not good practice to extend JFrame unless adding functionality

    Here is your code with above fixes (excuse picture quality but had to resize or it was going to 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();
                }
            });
        }
    }
    

    As per your comment:

    i am preparing a map which includes lots of polygons and yesterday i used a JPanel over a JFrame and i tried to check if mouse was inside of the polygon with MouseListener. later i saw that mouseListener gave false responds (like mouse is not inside of the polygon but it acts like it was inside the polygon). so i deleted the JPanel and then it worked

    Here is updated code with MouseAdapter and overridden mouseClicked to check if click was within polygon.

    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();
                }
            });
        }
    }
    
    0 讨论(0)
  • 2020-12-06 18:39

    JFrame does not extend JComponent so does not override paintComponent. You can check this by adding the @Override annotation.

    To get this functionality extract paintComponent to a new class which extends JComponent. Don't forget to call super.paintComponent(g) rather than super.paintComponents(g).

    0 讨论(0)
  • 2020-12-06 18:50

    Replace

    protected void paintComponent(Graphics g){
    
        super.paintComponents(g);
    
        g.setColor(Color.BLUE);
        g.drawPolygon(poly);
    
    }   
    

    With

    protected void paint(Graphics g){
    
        super.paint(g);
    
        g.setColor(Color.BLUE);
        g.drawPolygon(poly);
    
    }  
    
    0 讨论(0)
提交回复
热议问题