Java 如何等待达到某个值以继续该方法?

Java 如何等待达到某个值以继续该方法?,java,swing,Java,Swing,用户应该单击一个按钮,然后被告知单击JTextFields将其添加到ArrayList中。如何延迟if语句直到发生这种情况?您需要重新思考程序的运行方式,因为您在编写代码时就像编写了一个线性控制台程序,但事实并非如此。相反,您正在编写一个事件驱动的GUI程序,因此您应该对事件做出反应,并改变状态,而不是使用代码“wait” 如果您需要进一步的详细信息,请充实您的问题,包括提供更多关于您的程序应该做什么,您的ArrayList是什么意思,包括在此处(而不是在链接中)提供有效的(请阅读链接) 我试图

用户应该单击一个按钮,然后被告知单击JTextFields将其添加到ArrayList中。如何延迟if语句直到发生这种情况?

您需要重新思考程序的运行方式,因为您在编写代码时就像编写了一个线性控制台程序,但事实并非如此。相反,您正在编写一个事件驱动的GUI程序,因此您应该对事件做出反应,并改变状态,而不是使用代码“wait”

如果您需要进一步的详细信息,请充实您的问题,包括提供更多关于您的程序应该做什么,您的ArrayList是什么意思,包括在此处(而不是在链接中)提供有效的(请阅读链接)

我试图满足您的逻辑需求,并提出了一个创建一组JTextFields的小程序。单击时,它们持有的文本将添加到JTextArea,字段将添加到选定的字段ArrayList。当添加到列表中的字段数为4时,逻辑运行。这是从添加到所有文本字段的FocusListener调用的。例如:

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;
    }

}