我对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();
}
});
}
});
}
调用scoringsystem方法的主游戏类。
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”时,它确实工作得很好,在控制台中打印。但当我尝试更新类变量,然后在方法调用后尝试打印它时就不会了。不知道这是否有用。
2条答案
按热度按时间lbsnaicq1#
jframes不是模态的——您创建一个jframes并显示它,它不会阻止代码流,因此您在jframe显示时以及在用户有机会更改它之前提取scoreoption right的值。您需要使用模态对话框,例如作为模态对话框创建的jdialog,或者使用joptionpane(实际上只是一个隐藏在引擎盖下的模态jdialog)。这将阻止代码流,以便您仅在用户更改数据后提取数据。
一个例子证明了这一点:
如果您运行代码,当您显示子jframe时,在处理对话框之前,测试文本将立即显示在控制台中。如果按下按钮以显示对话框,则测试文本显示将延迟,直到按下按钮后更改文本。
按两次框架按钮将最终显示正确的文本,因为文本是在第一次显示时设置的。
eqqqjvef2#
jdialig就像jframe。也就是说,你添加组件到它就像你做任何帧。
不同的是,您可以创建jdialog模式。这意味着当您使用:
在关闭对话框之前,setvisible(…)语句后面的代码不会执行。这也意味着在对话框关闭之前不能单击父jframe。
创建
modal JDialog
就是使用JOptionPane
. 它有一些预定义的方法,可以方便地提示用户输入。例如,在您的案例中,您可以执行以下操作:
以上也是“mre”的一个例子。代码很简单,包含在一个类中,您可以复制/粘贴/编译和测试。
有关如何使用对话框的更多示例,请阅读swing教程中的部分
JOptionPane
.如果确实要使用单选按钮,则可以创建包含单选按钮的面板,并使用
showConfirmDialog(...)
方法。当对话框关闭时,您需要从ButtonModel
的ButtonGroup
.请参阅:how to set&manage the layout of joptionpane,这是一个基本的示例,可以帮助您入门。