Circle not showing up in JPanel

后端 未结 1 1212
清歌不尽
清歌不尽 2021-01-24 07:53

So I\'m trying to draw circles inside of the inner panel. I have a class, paintTimeUnit that creates the circle inside the panel given an xy coordinate

相关标签:
1条回答
  • 2021-01-24 08:45

    To have a component that draws a circle at a given location, properly override paintComponent as explained in oracle's tutorial:

    class PaintTimeUnit extends JPanel {
    
        private final int xlocation, ylocation;
        private static final int W = 500, H = 300, RADIUS = 50;
    
        public PaintTimeUnit(int x, int y) {
            xlocation = x;
            ylocation = y;
            setPreferredSize(new Dimension(W, H));
        }
    
        @Override
        public void paintComponent(Graphics g) { //override paintComponent for custom painting
            super.paintComponent(g); //call super
            g.setColor(Color.RED);  //set painting color
            g.drawOval(xlocation, ylocation, RADIUS, RADIUS); //draw circle
        }
    } 
    

    However, as advised, it may better to have a container that draws a bunch of circles.
    To achieve it you need to add a collection to store all circles to be painted such as

    List<Point> circleCenters== new ArrayList<>()

    You would also need to add points to that collection:

     void addCircle(int centerX, int centerY){
        circleCenters.add(new Point(centerX, centerY));
     }
    

    and have paintComponent draw circles based on their stored centers:

    public void paintComponent(Graphics g) { //override paintComponent for custom painting
        super.paintComponent(g); //call super
        g.setColor(Color.RED);  //set painting color
        for(Point center : circleCenters){
           g.drawOval(center.x, center.y, RADIUS, RADIUS); //draw circle
        }
    }
    

    Put it all together:

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.util.ArrayList;
    import java.util.List;
    class PaintTimeUnit extends JPanel {
    
        private final List<Point> circleCenters;
        private static final int W = 500, H = 300, RADIUS = 50;
    
        public PaintTimeUnit() {
            circleCenters = new ArrayList<>();
            setPreferredSize(new Dimension(W, H));
        }
    
        @Override
        public void paintComponent(Graphics g) { //override paintComponent for custom painting
            super.paintComponent(g); //call super
            g.setColor(Color.RED);  //set painting color
            for(Point center : circleCenters){
                g.drawOval(center.x, center.y, RADIUS, RADIUS); //draw circle
            }
        }
    
        void addCircle(int centerX, int centerY){
            circleCenters.add(new Point(centerX, centerY));
        }
    }
    

    And use it :

     PaintTimeUnit ptu= new PaintTimeUnit();
     //add 3 circles
     ptu.addCircle(90,90);
     ptu.addCircle(150,150);
     ptu.addCircle(210,90);
    


    (Run it online)

    0 讨论(0)
提交回复
热议问题