如何在 actionListener(actionEvent e) 中声明 JLabel,以便在单击 JButton 时可以设置文本

how to declare JLabels within actionListener(actionEvent e) so that Text can be set when JButton is clicked

我正在编写一个石头剪刀布游戏,我试图让每个 JLabel 在单击三个按钮(石头、剪刀、布)中的一个时更新。

问题是每个 JLabel 都是在 createWindow() 中定义的,我需要它们也在 ActionListener(ActionEvent e) 中定义。

我试图从 createWindow() 和 JLabels 更新中复制粘贴一些代码,但唯一的问题是它创建了一个全新的 window,没有按钮(仅包含文本) .如果我尝试在主要方法之外实例化标签,则 JLabel 根本不会显示。

感谢任何帮助(无论我是否必须重写整个程序),我是 Java 和 Swing 的新手,任何批评都会以某种方式提供帮助。 (我在 Eclipse 中写 IDE)。

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

  public class RockPaperScissors extends JPanel implements ActionListener {
public static void main(String[] args) {
    RockPaperScissors sm = new RockPaperScissors();
    sm.createWindow();
}
private void createWindow() {
    // create JFrame/JPanel
    JFrame frame = new JFrame("Rock! Paper! Scissors!");
    JPanel panel = new JPanel();
    JLabel title = new JLabel("Rock! Paper! Scissors!");
    JLabel playerchoice = new JLabel("");
    JLabel computerdecision = new JLabel("");
    JLabel outcome = new JLabel("");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.pack();
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    JButton button1 = new JButton("Rock");
    panel.add(button1);
    button1.addActionListener(this);
    button1.setBounds(480, 500, 100, 50);
    JButton button2 = new JButton("Paper");
    panel.add(button2);
    button2.addActionListener(this);
    button2.setBounds(590, 500, 100, 50);
    JButton button3 = new JButton("Scissors");
    panel.add(button3);
    button3.addActionListener(this);
    button3.setBounds(700, 500, 100, 50);
    frame.add(panel);
    panel.setLayout(new BorderLayout());
    GroupLayout layout = new GroupLayout(this);
    this.setLayout(layout);
    panel.add(title);
    panel.add(playerchoice);
    panel.add(computerdecision);
    panel.add(outcome);
    outcome.setBounds(571, 90, 260, 200);
    computerdecision.setBounds(571, 100, 260, 200);
    playerchoice.setBounds(571, 120, 260, 200);
    title.setBounds(571, 0, 260, 200);
}
     public void actionPerformed(ActionEvent e) {
    // JLabels
    int choice = 0;
    int computerchoice = 0;
    int min = -1;
    int max = -3;
    computerchoice = (int) (Math.random() * (max - min - 1) + min);
    if (computerchoice == -1) {
        panel.add(computerdecision);
        computerdecision.setText("The Computer Chose Rock!");
        // for checking
        System.out.println("The Computer Chose Rock!");
    } else if (computerchoice == -2) {
        panel.add(computerdecision);
        computerdecision.setText("The Computer Chose Paper!");
        // for checking
        System.out.println("The Computer Chose Paper!");
    } else if (computerchoice == -3) {
        panel.add(computerdecision);
        computerdecision.setText("The Computer Chose Scissors!");
        // for checking
        System.out.println("The Computer chose Scissors!");
    }
    if (e.getActionCommand().equals("Rock")) {
        choice = 1;
        panel.add(playerchoice);
        playerchoice.setText("You chose Rock!");
        // for checking
        System.out.println("You chose Rock!");
    } else if (e.getActionCommand().equals("Paper")) {
        choice = 2;
        panel.add(playerchoice);
        playerchoice.setText("You chose Paper!");
        // for checking
        System.out.println("You chose Paper!");
    } else if (e.getActionCommand().equals("Scissors")) {
        choice = 3;
        panel.add(playerchoice);
        playerchoice.setText("You chose Scissors!");
        // for checking
        System.out.println("You chose Scissors!");
    }
    if (choice + computerchoice == 0) {
        panel.add(outcome);
        outcome.setText("It is a Tie!");
        // for checking
        System.out.println("It is a Tie!");
    } else if (choice + computerchoice == 1 || choice + computerchoice == -2) {
        panel.add(outcome);
        outcome.setText("You Win!");
        // for checking
        System.out.println("You Win!");
    } else if (choice + computerchoice == 2 || choice + computerchoice == -1) {
        panel.add(outcome);
        outcome.setText("You Lose...");
        // for checking
        System.out.println("You Lose...");
    }
}}

解决你的问题很简单,只需要将panelplayerchoicecomputerdecisionoutcome成员设为RockPaperScissorsclass 而不是像这样的局部变量

public class RockPaperScissors extends JPanel implements ActionListener {
     private JPanel panel;
     private JLabel computerdecision;
     private JLabel playerchoice;
     private JLabel outcome;

     ...

     private void createWindow() {
         JFrame frame = new JFrame("Rock! Paper! Scissors!");
         panel = new JPanel();
         playerchoice = new JLabel("");
         computerdecision = new JLabel("");
         outcome = new JLabel("");
         JLabel title = new JLabel("Rock! Paper! Scissors!");
         ...
     }
     ...
}