Слушатель действия не обновляет переменную в Java - PullRequest
0 голосов
/ 23 июня 2019

Я работаю над созданием небольшой программы для воссоздания игры.До сих пор я создал небольшой графический интерфейс.Мой вопрос заключается в том, что когда я создал прослушиватель действий для обновления переменной counterNum, которая затем обновляет cookieCountLabel, экран не обновляет, а говорит только один.Я думал, что если кнопка нажата counterNum должен равняться counterNum + 1. И тогда он должен был обновить cookieCountLabel, но это, похоже, не сработало.

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JComponent;
import java.awt.Graphics;
import java.awt.Canvas;
import java.awt.FlowLayout;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
 *Author:Graham
 *Lang:Java
 *Program: Cookie Clicker
 *Date Created: 6/22/2019
 *CITATION:
 *Some GUI concepts from(the pdf you provided):https://lms.dist113.org/attachment/907907595/docviewer
 *Some GUI concepts from https://www.guru99.com/java-swing-gui.html
 */
public class Clicker extends JComponent
{
    public static void main(String[] args){
        //variables



        //frame
        JFrame frame = new JFrame("Cookie Clicker");
        frame.setLocationRelativeTo(null);

        frame.setSize(300,300);

        frame.setResizable(true);
        frame.setLayout(null);

        //close on click x
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //buttons
        JButton cookie = new JButton("Cookie");
        cookie.setBounds(80,0, 140, 20);
        //to set visible
        frame.setVisible(true);
        frame.add(cookie);



        //listen for click
        cookie.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            Integer counterNum = 0;
            counterNum += 1;
            String convert = counterNum.toString();
            JLabel cookieCountLabel = new JLabel();
            cookieCountLabel.setBounds(140,120,50,20);
            cookieCountLabel.setText(convert);
            frame.add(cookieCountLabel);



            }



        });


    }
}

1 Ответ

2 голосов
/ 23 июня 2019

Прежде всего, вы устанавливаете свой counterNum в 0 каждый раз, когда нажимаете кнопку.Поэтому значение counterNum всегда будет отображаться как 1:

cookie.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            Integer counterNum = 0; !!! -> error here
            counterNum += 1;

. Чтобы это исправить, выньте переменную counterNum из метода main и сделайте ее полем.

public class Clicker extends JComponent
{
    private static int counterNum; !!!

    public static void main(String[] args){
     ...

Далее, каждый раз, когда вы нажимаете кнопку, вы создаете новую метку, которая содержит значение counterNum.Как указано в комментариях, вы, вероятно, не хотите создавать новый объект Label каждый раз, когда нажимаете кнопку, а скорее хотите изменить значение, которое написано на Label.Поэтому выньте код создания Label из ActionListener и поместите его в ваш основной метод.Теперь у вас будет только 1 метка, которая содержит значение counterNum.

public static void main(String[] args){

        JLabel cookieCountLabel = new JLabel(); !!!
        cookieCountLabel.setBounds(140,120,50,20); !!!

        //frame
        JFrame frame = new JFrame("Cookie Clicker");
        frame.setLocationRelativeTo(null);

Теперь, когда вы нажимаете кнопку, новая метка не создается, но значение counterNum изменяется и увеличивается на 1. ЭтоВот как теперь должен выглядеть ваш ActionListener:

cookie.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        counterNum += 1; //increment counterNum by 1
        String convert = counterNum + ""; //convert to String
        cookieCountLabel.setText(convert);
        frame.add(cookieCountLabel);
    }

enter image description here

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