Как проверить, был ли выбран (выбран) определенный объект (круг) в моей панели jPanel (#java#netbeans)?

Я не знаю, как проверить, нажимаю ли я кружок в JPanel. И если я это делаю, у меня возникает проблема с частью "удаление" (перерисовка белым цветом) в ветке, потому что это позволяет кое-что отложить. В основном я хочу сделать игру, в которой, если вы нажмете «Пуск», круги будут появляться на экране случайным образом с заданной скоростью, и они начнут уменьшаться, как только они появятся. Если вы нажмите на них (часть выбора), они исчезнут, и это даст вам 1 балл. Если круг исчезает, вы получаете -1 балл. И я сделал остановку тоже в некотором роде. Вот код.

Мой JFrame

public class JFrame extends javax.swing.JFrame {

    Minge m;
    GenerareMinge mg;

    /**
     * Creates new form JFrame
     */
    public JFrame() {
        initComponents();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        jPanel1 = new javax.swing.JPanel();
        jToggleButton1 = new javax.swing.JToggleButton();
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jPanel1MouseClicked(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 500, Short.MAX_VALUE));
        jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 500, Short.MAX_VALUE));

        jToggleButton1.setText("START");
        jToggleButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButton1ActionPerformed(evt);
            }
        });

        jLabel1.setText("Score: 0");

        jButton1.setText("STOP");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jToggleButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(0, 29, Short.MAX_VALUE))).addContainerGap()));
        layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(0, 11, Short.MAX_VALUE)).addGroup(layout.createSequentialGroup().addGap(28, 28, 28).addComponent(jToggleButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(36, 36, 36).addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(38, 38, 38).addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        pack();
    } // </editor-fold>                        
    private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        Graphics g = jPanel1.getGraphics();

        Random rand = new Random();

        Color randomColor = new Color(1, 1, 1);

        int latime = jPanel1.getWidth(),
        inaltime = jPanel1.getHeight();

        mg = new GenerareMinge(inaltime, latime, true, g, randomColor);
        mg.start();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        mg.finish = false;
    }
}

Мой объект

public class Cerc {

    public int score = 0;
    int x,
    y,
    r;
    Graphics g;
    Color c;

    int ok = 2;

    public Cerc(int x, int y, int r, Graphics g, Color c) {
        this.x = x;
        this.y = y;
        this.r = r;
        this.g = g;
        this.c = c;
    }

    public Cerc(Graphics g) {

    }

    void draw() {
        g.setColor(c);
        g.drawOval(x - r, y - r, 2 * r, 2 * r);
        g.fillOval(x - r, y - r, 2 * r, 2 * r);
    }

    void show() {
        g.setColor(c);
        draw();
    }

    void delete() {
        g.setColor(Color.white);
        g.drawOval(x - r, y - r, 2 * r, 2 * r);
        g.fillOval(x - r, y - r, 2 * r, 2 * r);
    }

    void minimize(int dx) {

        delete();

        Random rand = new Random();
        float valRand = rand.nextFloat() * 2;
        r -= valRand;
        show();
    }

}

Моя тема для создания круга при нажатии на кнопку jButton

public class GenerareMinge extends Thread {

    boolean finish;
    int inaltime;
    int latime;
    Graphics g;
    Color color;

    public GenerareMinge(int inaltime, int latime, boolean finish, Graphics g, Color color) {
        this.finish = finish;
        this.latime = latime;
        this.inaltime = inaltime;
        this.g = g;
        this.color = color;
    }

    @Override
    public void run() {

        while (finish) {

            try {
                Random rand = new Random();
                float R = rand.nextFloat();
                float G = rand.nextFloat();
                float B = rand.nextFloat();

                color = new Color(R, G, B);

                Cerc c = new Cerc(rand.nextInt(inaltime), rand.nextInt(latime), rand.nextInt(100), g, color);
                c.draw();

                Minge m = new Minge(c, true);
                m.start();

                sleep(200);
            } catch(InterruptedException ex) {
                Logger.getLogger(Minge.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }
}

Моя ветка для сворачивания

public class Minge extends Thread {

    Cerc c;
    boolean finish;
    public Minge(Cerc c, boolean finish) {
        this.c = c;
        this.finish = finish;
    }

    @Override
    public void run() {

        while (finish) {
            c.minimize(1);

            try {
                sleep((int)(50 * Math.random()));
            } catch(InterruptedException ex) {
                Logger.getLogger(Minge.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }
}

person Rex Brute    schedule 06.06.2020    source источник
comment
Отвечает ли это на ваш вопрос? Точка внутри круга   -  person Andreas    schedule 06.06.2020
comment
Я бы порекомендовал вам переформатировать код в выбранном вами редакторе/IDE, для этого должны быть автоматические инструменты.   -  person MelvinWM    schedule 06.06.2020
comment
Меня немного беспокоит ваше использование потоков, это несколько «продвинутая» тема. Но когда вы пишете, вам нужен какой-то способ, чтобы круги исчезли или что-то подобное. Я бы порекомендовал вам использовать что-то другое, что поможет вам избежать использования потоков, например, один экземпляр docs.oracle.com/javase/tutorial/uiswing/misc/timer.html, который стирает все ваши круги. В типичном игровом движке будет игровой цикл, выполняемый несколько раз в секунду (относительно кадров в секунду или FPS), а затем вы можете просто затушевать круги в этом цикле.   -  person MelvinWM    schedule 06.06.2020
comment
Вы щелкнули внутри круга, если расстояние от центра круга до точки щелчка меньше или равно радиусу. Формула расстояния: Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));   -  person Gilbert Le Blanc    schedule 06.06.2020