Java 如何等待达到某个值以继续该方法?
用户应该单击一个按钮,然后被告知单击JTextFields将其添加到ArrayList中。如何延迟if语句直到发生这种情况?您需要重新思考程序的运行方式,因为您在编写代码时就像编写了一个线性控制台程序,但事实并非如此。相反,您正在编写一个事件驱动的GUI程序,因此您应该对事件做出反应,并改变状态,而不是使用代码“wait” 如果您需要进一步的详细信息,请充实您的问题,包括提供更多关于您的程序应该做什么,您的ArrayList是什么意思,包括在此处(而不是在链接中)提供有效的(请阅读链接) 我试图满足您的逻辑需求,并提出了一个创建一组JTextFields的小程序。单击时,它们持有的文本将添加到JTextArea,字段将添加到选定的字段ArrayList。当添加到列表中的字段数为4时,逻辑运行。这是从添加到所有文本字段的FocusListener调用的。例如:Java 如何等待达到某个值以继续该方法?,java,swing,Java,Swing,用户应该单击一个按钮,然后被告知单击JTextFields将其添加到ArrayList中。如何延迟if语句直到发生这种情况?您需要重新思考程序的运行方式,因为您在编写代码时就像编写了一个线性控制台程序,但事实并非如此。相反,您正在编写一个事件驱动的GUI程序,因此您应该对事件做出反应,并改变状态,而不是使用代码“wait” 如果您需要进一步的详细信息,请充实您的问题,包括提供更多关于您的程序应该做什么,您的ArrayList是什么意思,包括在此处(而不是在链接中)提供有效的(请阅读链接) 我试图
btnStraight = new JButton("Straight");
btnStraight.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
/* Delay if statement until an ArrayList reaches a certain size */
if(RouletteHelperMethods.doBet("Straight") == 1){
textArea.setText("Congrats, you won!");
} else {
textArea.setText("Sorry, you lost.");
}
}
});
导入java.awt.Color;
导入java.awt.GridLayout;
导入java.awt.event.*;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.*;
@抑制警告(“串行”)
公共类EventDrivenGui扩展了JPanel{
专用静态最终整型字段_SIZE=10;
私有静态最终选定整型\字段\大小=4;
选择的受保护静态最终颜色\u Color=Color.PINK;
私人JButton btnStraight;
私有JTextArea textArea=新JTextArea(20,40);
private List selectedFieldList=新建ArrayList();
private List fieldList=new ArrayList();
公共事件驱动程序{
btnStraight=新的JButton(“直”);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
如果(selectedFieldList.size()>0){
返回;
}
for(JTextField textField:fieldList){
textField.setEnabled(true);
}
showMessageDialog(btnStraight,“请选择一个文本字段”,
“进行选择”,JOptionPane.信息(信息);
}
});
textArea.setFocusable(false);
JPanel fieldPanel=新的JPanel(新的网格布局(0,1,5,5));
对于(int i=0;i<字段大小;i++){
JTextField=newjtextfield(“字段”+(i+1),10);
field.setEnabled(false);//因此他们不能过早地选择它
字段列表。添加(字段);
fieldPanel.add(字段);
field.addFocusListener(新的FocusAdapter(){
@凌驾
获得公共无效焦点(焦点事件e){
JTextField=(JTextField)e.getComponent();
如果(!selectedFieldList.contains(tf)){
extarea.append(tf.getText()+“\n”);
tf.挫折背景(选定的颜色);
选择字段列表。添加(tf);
如果(selectedFieldList.size()>=所选字段大小){
if(轮盘赌辅助方法多比特(“直线”)==1){
textArea.append(“恭喜,你赢了!\n”);
}否则{
append(“对不起,您丢失了。\n”);
}
重置();
}
}
}
});
}
添加(btnStraight);
添加(新的JScrollPane(textArea));
添加(现场面板);
}
受保护的无效重置(){
selectedFieldList.clear();
for(JTextField JTextField:fieldList){
jTextField.setEnabled(false);
jTextField.setBackground(空);
}
}
私有静态void createAndShowGui(){
EventDrivenGui主面板=新建EventDrivenGui();
JFrame=新JFrame(“EventDrivenGui”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
}
类轮盘赌辅助方法{
公共静态int doBet(字符串下注){
返回Math.random()>0.5?1:0;
}
}
请提供更多详细信息--“将它们添加到ArrayList”是什么意思?我觉得我们在黑暗中摸索,你对我们隐瞒了太多的信息。我编辑了我的问题,我正在将JTextFields添加到ArrayList中,一旦用户单击按钮,他们应该被告知单击JTextFields,将其添加到他们想赌的字段中。一旦JTextFields的ArrayList达到一定的大小,在本例1中,我想运行if语句。请再编辑一些。询问时,如果我们看不到您未显示的所有代码,也无法理解未完全解释的概念。同时显示图片,或至少显示图片链接,我们将编辑您的帖子并为您发布图片。抱歉,麻烦您了。我接受了你的建议,只是重新思考了这个程序是如何运行的。这需要更多的方法,但现在变得更有意义了。谢谢你的帮助。谢谢你的示例代码,很高兴看到另一种方法。不幸的是,我刚上完高中的java课,我们没有讨论FocusListener。
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
@SuppressWarnings("serial")
public class EventDrivenGui extends JPanel {
private static final int FIELD_SIZE = 10;
private static final int SELECTED_FIELD_SIZE = 4;
protected static final Color SELECTED_COLOR = Color.PINK;
private JButton btnStraight;
private JTextArea textArea = new JTextArea(20, 40);
private List<JTextField> selectedFieldList = new ArrayList<>();
private List<JTextField> fieldList = new ArrayList<>();
public EventDrivenGui() {
btnStraight = new JButton("Straight");
btnStraight.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (selectedFieldList.size() > 0) {
return;
}
for (JTextField textField : fieldList) {
textField.setEnabled(true);
}
JOptionPane.showMessageDialog(btnStraight, "Please Select a text field",
"Make Selection", JOptionPane.INFORMATION_MESSAGE);
}
});
textArea.setFocusable(false);
JPanel fieldPanel = new JPanel(new GridLayout(0, 1, 5, 5));
for (int i = 0; i < FIELD_SIZE; i++) {
JTextField field = new JTextField("Field " + (i + 1), 10);
field.setEnabled(false); // so they can't select it prematurely
fieldList.add(field);
fieldPanel.add(field);
field.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
JTextField tf = (JTextField) e.getComponent();
if (!selectedFieldList.contains(tf)) {
textArea.append(tf.getText() + "\n");
tf.setBackground(SELECTED_COLOR);
selectedFieldList.add(tf);
if (selectedFieldList.size() >= SELECTED_FIELD_SIZE) {
if (RouletteHelperMethods.doBet("Straight") == 1) {
textArea.append("Congrats, you won!\n");
} else {
textArea.append("Sorry, you lost.\n");
}
reset();
}
}
}
});
}
add(btnStraight);
add(new JScrollPane(textArea));
add(fieldPanel);
}
protected void reset() {
selectedFieldList.clear();
for (JTextField jTextField : fieldList) {
jTextField.setEnabled(false);
jTextField.setBackground(null);
}
}
private static void createAndShowGui() {
EventDrivenGui mainPanel = new EventDrivenGui();
JFrame frame = new JFrame("EventDrivenGui");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
class RouletteHelperMethods {
public static int doBet(String bet) {
return Math.random() > 0.5 ? 1 : 0;
}
}