【发布时间】:2021-03-13 00:04:03
【问题描述】:
我对 Java 还很陌生,只有在研究和谷歌搜索并阅读了许多答案之后,我才发布这个。我有点迷路了。一点指导会有很大帮助。以下是实现“ActionListener”接口的类中的方法。我想要做的是:有一个按钮,单击应该打开一个新窗口,其中包含两个单选按钮形式的两个选项。我需要知道选择在我的代码中进一步使用的单选按钮。我将“scoreOption”变量声明为类变量和静态变量,然后尝试在“actionPerformed”抽象方法中对其进行更新。但是当我引用它时(在方法调用之后),值保持不变 - null,或者我最初设置的任何值。代码如下:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class StartEvents implements ActionListener {
StartPanel startingPanel;
static String scoreOption;
public StartEvents(StartPanel startPanel) {
startingPanel = startPanel;
}
// Scoring System Window - 1
public void scoringSystem() {
startingPanel.scoringSystem.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent e) {
Panel scoringSystemPanel = new Panel();
JFrame scoreSystemFrame = scoringSystemPanel.frame(150, 250, "Scoring System", 2, true);
JPanel scoreSystemPanel = scoringSystemPanel.panel(Color.lightGray);
JButton confirmSelection = scoringSystemPanel.button(40, 20, "Confirm");
JRadioButton scoreSystem1 = scoringSystemPanel.radioButton("Option 1: Same Points Per Hit");
scoreSystem1.setActionCommand("Option 1");
JRadioButton scoreSystem2 = scoringSystemPanel.radioButton("Option 2: Unique Points Per Hit");
scoreSystem2.setActionCommand("Option 2");
ButtonGroup scoreSys = new ButtonGroup();
scoreSys.add(scoreSystem1);
scoreSys.add(scoreSystem2);
scoreSystemFrame.getContentPane().add(scoreSystemPanel);
scoreSystemPanel.add(scoreSystem1);
scoreSystemPanel.add(scoreSystem2);
scoreSystemPanel.add(confirmSelection);
// Get Selection Event
// Option 1
scoreSystem1.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent e) {
if (scoreSystem1.isSelected()) {
scoreOption = scoreSystem1.getActionCommand();
}
}
});
// Option 2
scoreSystem2.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent e) {
if (scoreSystem2.isSelected()) {
scoreOption = scoreSystem2.getActionCommand();
}
}
});
// Confirm Event
confirmSelection.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
scoreSystemFrame.dispose();
}
});
}
});
}
调用评分系统方法的主游戏类。
import java.util.ArrayList;
public class Game {
public static void main(String[] args) {
StartPanel startingPanel = new StartPanel();
startingPanel.makeStartPanel();
StartEvents starter = new StartEvents(startingPanel);
starter.rulesButton();
starter.exitButton();
starter.highScoresButton();
ArrayList<Integer> dimensions = starter.boardSizeSelector();
// Problem Zone
System.out.println(StartEvents.scoreOption);
starter.scoringSystem();
System.out.println(StartEvents.scoreOption);
// The two values of scoreOption should be different
String[] playPanelDetails = {"970", "Player 1", "450"};
// Final Start of the Game
starter.startGameButton(playPanelDetails, dimensions);
}
}
此外,您能否就以下问题告诉我:
- 建议在另一个“ActionListener”中实现“ActionListener”?好的做法?
- “actionPerformed”方法只能声明一个,还是也可以重载?
- 是否可以从“actionPerformed”方法中获取返回值?
如果能提供一些提示,我将不胜感激。我真的尝试了很多,然后才在这里发布。非常感谢您。
小编辑:当我在那里“System.out.println”“actioncommand”本身时,它可以完美地工作,在控制台中打印。但是当我尝试更新类变量然后在方法调用后尝试打印它时不会。不知道这是否有帮助。
【问题讨论】:
-
查看minimal reproducible example 链接,因为这是其他人了解当前代码为何无法按预期工作的最佳方式。该链接将解释这是什么、如何创建以及为什么它可以帮助您和我们。请注意,这不是对您的整个程序或不可运行的 sn-ps 的请求(就像您现在提供的那样),而是一个我们可以运行的新的小型演示程序,它向我们展示了问题。
-
在我看来,我们无法从上面的代码中看到为什么 scoreOption 保持为空,除了 JFrame 不是模式窗口,而且您当然不想在应用程序中显示多个 JFrame。也许您需要一个模态对话框窗口,例如模态 JDialog 而不是 JFrame。变量为空还有其他原因,例如变量阴影,但是这是否发生仍然是任何人的猜测。
-
你能不能至少给我们看一下
scoreOption的声明? -
关于ActionListener中的ActionListener,一般来说这样是可以的,但实际上这段代码应该被大量重构为不同的类,更不用说不同的方法了。
-
@DawoodibnKareem 我添加了完整的课程。这就是你要找的东西吗?
标签: java swing interface radio-button