Можем ли мы заменить JLabel из другого класса в java? - PullRequest
1 голос
/ 25 января 2020

Я новичок в java и пытаюсь использовать JLabel и JButton. Моя проблема в том, что я не могу изменить JLabel в методе actionPerformed(). Не может найти переменную nbr. Пожалуйста, помогите :(

package com.test;

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main extends JFrame implements ActionListener{

    int x = 0;

    public static void main(String[] args) {
        new Main().setVisible(true);
    }

    public Main(){
        super("Test");
        setSize(640, 480);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(new FlowLayout());
        JButton button1 = new JButton("Button1");
        button1.addActionListener(this);
        add(button1);
        JLabel nbr = new JLabel(x);
        add(nbr);
    }

    public void actionPerformed(ActionEvent e){
        x++;
        nbr.setText(x);
    }
}

Ответы [ 3 ]

2 голосов
/ 25 января 2020

Это потому, что вы обращаетесь к переменной, которая находится в другой и ограниченной области. В вашем случае ваш nbr определен в вашей функции Main() и ограничен только этой областью. Если вы хотите получить к нему доступ, вы должны сделать его глобальным, значит, вы должны объявить его в своем классе.

Пример:

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main extends JFrame implements ActionListener{

    int x = 0;
    private JLabel nbr; // declare a global variable

    public static void main(String[] args) {
        new Main().setVisible(true);
    }

    public Main(){
        super("Test");
        nbr = new JLabel(); // initialize here...

        setSize(640, 480);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(new FlowLayout());
        JButton button1 = new JButton("Button1");
        button1.addActionListener(this);
        add(button1);
        nbr.setText(x); // set text to that variable here...
        add(nbr);
    }

    public void actionPerformed(ActionEvent e){
        x++;
        nbr.setText(x);
    }
}

Ps : Проверьте на наличие любых синтаксических ошибок, я написал это без тестирования. :)

0 голосов
/ 25 января 2020

Вы также можете попробовать что-то вроде этого:

public class Main extends JFrame {

    public static void main(final String[] args) {
        new Main().setVisible(true);
    }

    public Main(){
        super("Test");
        setSize(640, 480);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(new FlowLayout());

        final JButton button1 = new JButton("Button1");
        final JLabel  nbr     = new JLabel("0");
        add(button1);
        add(nbr);

        final AtomicInteger x = new AtomicInteger();

        button1.addActionListener(e -> {
            nbr.setText("" + x.incrementAndGet());
        });
    }
}
0 голосов
/ 25 января 2020

Если вы предпочитаете не делать nbr членом класса Main, но сохранять его как локальную переменную в конструкторе классов, вы все равно можете использовать API Swing для обновления JLabel текст из метода actionPerformed(). Пример кода ниже. Обратите внимание, что как для конструктора JLabel, так и для его метода setText() требуется аргумент String, а не аргумент int, поэтому отправленный вами код не компилируется. Я предлагаю вам прочитать Как создать минимальный воспроизводимый пример . В любом случае, я исправил эту ошибку в приведенном ниже коде.

import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame implements ActionListener {
    int x = 0;

    public static void main(String[] args) {
        new Main().setVisible(true);
    }

    public Main(){
        super("Test");
        setSize(640, 480);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(new FlowLayout());
        JButton button1 = new JButton("Button1");
        button1.addActionListener(this);
        add(button1);
        JLabel nbr = new JLabel(String.valueOf(x));
        add(nbr);
    }

    public void actionPerformed(ActionEvent e){
        x++;
        Container contentPane = getContentPane();
        Component[] cmpts = contentPane.getComponents();
        for (Component cmpt : cmpts) {
            if (cmpt instanceof JLabel) {
                JLabel nbr = (JLabel) cmpt;
                nbr.setText(String.valueOf(x));
            }
        }
    }
}
...