Попытка изменить текст метки на переменную при нажатии кнопки, но не удается получить доступ к классу - PullRequest
0 голосов
/ 18 июня 2020

Некоторое время я пытался изменить текст метки на переменную при нажатии кнопки, но не могу получить доступ к классу. Когда кнопка нажата, он должен изменить текст iscoreTotal на переменные щелчки, и он обновляется каждый раз, но я не могу понять, как получить доступ к классу. Я пытаюсь получить доступ к началу класса, где создается метка, поэтому я могу изменить ее в классе Circle нажатием кнопки

package stackover;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.concurrent.ThreadLocalRandom;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class PaintFrame extends JFrame {

// Variables for defining size and position of the circle

public static int iCircleSize() {
    return (int) (Math.random() * 100 + 1);
}

public static int iCirclePosX() {
    return (int) (Math.random() * 450 + 100);
}

public static int iCirclePosY() {
    return (int) (Math.random() * 450 + 100);
}

public static int iclicks = 0;

private static JPanel content = new JPanel();
private PaintPanel paintPanel = new PaintPanel();

public PaintFrame() {
    getContentPane().add(content);
    content.setLayout(new BorderLayout());
    content.add(paintPanel, BorderLayout.CENTER);

}

public static void main(String[] args) {
    new PaintFrame();
    PaintFrame.start();
}

public static void start() {
    int istartPosX = iCirclePosX();
    int istartPosY = iCirclePosY();
    PaintPanel board = new PaintPanel();
    board.add(new Circle(istartPosX, istartPosY, new Dimension(100, 100)));
    board.add(new Circle(istartPosX, istartPosY, new Dimension(100, 100)));
    board.add(new Circle(istartPosX, istartPosY, new Dimension(100, 100)));

    JFrame frame = new JFrame("Oscar's Aim Trainer");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setSize(650, 650);
    frame.setContentPane(board);
    frame.setVisible(true);
    board.setVisible(true);
    frame.setLayout(new BorderLayout());
    JPanel panel = new JPanel();
    JLabel iscoreTotal = new JLabel("0");
    panel.add(iscoreTotal);
    iscoreTotal.setBounds(50, 350, 100, 35);
    iscoreTotal.setBackground(Color.black);
    iscoreTotal.setForeground(Color.black);
    frame.add(panel);
    panel.setLayout(null);

    }
}

class PaintPanel extends JPanel {
PaintPanel() {
    super(null);
}
}

class Circle extends JComponent {

Circle(int x, int y, Dimension size) {
    setBounds(new Rectangle(new Point(x, y), size));
    addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            move();
            System.out.println("Clicked, " + getBounds());
            PaintFrame.iclicks++;
            System.out.println(+PaintFrame.iclicks);
            if (PaintFrame.iclicks == 10) {
                System.exit(0);
            }

        }
    });
}

private void move() {

    int iSize = PaintFrame.iCircleSize();
    int istartPosX = PaintFrame.iCirclePosX();
    int istartPosY = PaintFrame.iCirclePosY();
    setLocation(new Point(ThreadLocalRandom.current().nextInt(istartPosX),
            ThreadLocalRandom.current().nextInt(istartPosY)

    ));
    setSize(iSize + 50, iSize + 50);
}

@Override

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.RED);
    // This code accounts for the shape of the object being placed
    int count = 1;
    for (int i = 0; i < count; i++) {
        g.fillOval(0, 0, getWidth(), getHeight());
    }
}

;
}

1 Ответ

0 голосов
/ 13 августа 2020

У вас должна быть ссылка на этикетку, чтобы вы могли изменить ее текст. Итак, нам нужно иметь ссылку на метку в классе круга. Во-первых, вам нужно переместить переменную lable в область класса. Затем вам нужен способ ссылки на ваш класс PaintFrame. Я сделал это с помощью переменной stati c класса instance. Но вы также можете использовать другие способы, но этот довольно приятный в использовании. Вот код, надеюсь, он сработает:

package stackover;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.concurrent.ThreadLocalRandom;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class PaintFrame extends JFrame {

// Variables for defining size and position of the circle

public static int iCircleSize() {
    return (int) (Math.random() * 100 + 1);
}

public static int iCirclePosX() {
    return (int) (Math.random() * 450 + 100);
}

public static int iCirclePosY() {
    return (int) (Math.random() * 450 + 100);
}

public static int iclicks = 0;

private static JPanel content = new JPanel();
private PaintPanel paintPanel = new PaintPanel();

public PaintFrame() {
    getContentPane().add(content);
    content.setLayout(new BorderLayout());
    content.add(paintPanel, BorderLayout.CENTER);

}

public static void main(String[] args) {
    new PaintFrame();
    PaintFrame.start();
}

public static PaintFrame instance; //Here is the static reference of the class. 
public JLabel iscoreTotal; // Here is the public reference of your label.

public static void start() {
    instance = this; // Here we assing the static refernec the current context.

    int istartPosX = iCirclePosX();
    int istartPosY = iCirclePosY();
    PaintPanel board = new PaintPanel();
    board.add(new Circle(istartPosX, istartPosY, new Dimension(100, 100)));
    board.add(new Circle(istartPosX, istartPosY, new Dimension(100, 100)));
    board.add(new Circle(istartPosX, istartPosY, new Dimension(100, 100)));

    JFrame frame = new JFrame("Oscar's Aim Trainer");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setSize(650, 650);
    frame.setContentPane(board);
    frame.setVisible(true);
    board.setVisible(true);
    frame.setLayout(new BorderLayout());
    JPanel panel = new JPanel();

// now we only assing iscoreTotal not decalre it because we already did that.
    iscoreTotal = new JLabel("0"); 
    panel.add(iscoreTotal);
    iscoreTotal.setBounds(50, 350, 100, 35);
    iscoreTotal.setBackground(Color.black);
    iscoreTotal.setForeground(Color.black);
    frame.add(panel);
    panel.setLayout(null);

    }
}

class PaintPanel extends JPanel {
PaintPanel() {
    super(null);
}
}

class Circle extends JComponent {

Circle(int x, int y, Dimension size) {
    setBounds(new Rectangle(new Point(x, y), size));
    addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            move();
            System.out.println("Clicked, " + getBounds());
            PaintFrame.iclicks++;
            System.out.println(+PaintFrame.iclicks);

            // now you can assing the click varibel to you lable.
            PaintFrame.instance.iscoreTotal.text = PaintFrame.iclicks; 

            if (PaintFrame.iclicks == 10) {
                System.exit(0);
            }

        }
    });
}

private void move() {

    int iSize = PaintFrame.iCircleSize();
    int istartPosX = PaintFrame.iCirclePosX();
    int istartPosY = PaintFrame.iCirclePosY();
    setLocation(new Point(ThreadLocalRandom.current().nextInt(istartPosX),
            ThreadLocalRandom.current().nextInt(istartPosY)

    ));
    setSize(iSize + 50, iSize + 50);
}

@Override

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.RED);
    // This code accounts for the shape of the object being placed
    int count = 1;
    for (int i = 0; i < count; i++) {
        g.fillOval(0, 0, getWidth(), getHeight());
    }
}

;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...