Круг не отображается в JPanel - PullRequest
       163

Круг не отображается в JPanel

1 голос
/ 25 апреля 2020

Итак, я пытаюсь нарисовать круги внутри панели inner. У меня есть класс paintTimeUnit, который создает круг внутри панели с заданной парой координат xy, но всякий раз, когда я создаю новый объект paintTimeUnit и добавляю его на панель, он, кажется, не отображается.

public class paintTimeUnit extends JPanel {


    private static final long serialVersionUID = 1L;
    private int value;
    private int xlocation;
    private int ylocation;

    public paintTimeUnit(int x, int y) {
        value = 0;
        xlocation = x;
        ylocation = y;
    }

    public void paint(Graphics g) {    
        g.drawOval(xlocation, ylocation, 100, 100);  
        g.setColor(Color.RED);    
    }  

    public int getValue() {
        return value;
    }

    public void setValue(int t) {
        value = t;
    }

}

И реализация его выглядит следующим образом:

           JPanel Panel = new JPanel();
           ...
           JPanel inner = new JPanel();
           inner.setLayout(null);
           inner.setSize(325, 570);
           inner.setBackground(null);
           inner.setLocation(500, 350);
           inner.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.BLACK));
           inner.setVisible(true);

           paintTimeUnit hour1 = new paintTimeUnit(600, 400);
           hour1.setValue(1);
           hour1.setVisible(true);
           inner.add(hour1);

           //----Containers to Panel/Panel to Frame---------
           Panel.add(inner);
           ...
           frame.add(Panel, BorderLayout.CENTER);

1 Ответ

1 голос
/ 26 апреля 2020

Чтобы иметь компонент, который имеет aws кружок в заданном месте, правильно переопределите paintComponent, как объяснено в oracle учебнике :

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
    }
} 

Однако Как и было рекомендовано, лучше иметь контейнер, который содержит aws круг кружков. Для этого вам нужно добавить коллекцию, в которой будут храниться все круги, например:

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

Вам также необходимо добавить очки к этой коллекции:

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

и иметь paintComponent рисовать круги на основе их сохраненных центров:

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
    }
}

Поместите его все вместе:

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

И используйте его:

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


( Запустите его онлайн )
...