Java 防止代码在用户输入前返回值

Java 防止代码在用户输入前返回值,java,swing,jframe,user-input,Java,Swing,Jframe,User Input,我有以下代码通过JCombo框从用户那里获得2个输入,然后,我将获得的输入值s返回给调用函数,但问题是,此代码显示获取用户输入的帧,但在用户可以按下“Ok”按钮之前,它会将空值返回给调用函数。我希望在此方法中停止代码,直到用户按下“Ok”按钮。 请提出一些建议 package io; import java.io.*; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.eve

我有以下代码通过JCombo框从用户那里获得2个输入,然后,我将获得的输入值s返回给调用函数,但问题是,此代码显示获取用户输入的帧,但在用户可以按下“Ok”按钮之前,它会将空值返回给调用函数。我希望在此方法中停止代码,直到用户按下“Ok”按钮。 请提出一些建议

package io;

import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener;
import java.awt.Insets; 
import java.io.FileNotFoundException;

public class SrcAndTargLangInput implements ActionListener {
    public static JFrame frame;
    public static JComboBox sourcLang;
    public static JComboBox targLang;
    public static JLabel setSrcLang;
    public static JLabel setTargLang;
    public static JButton ok;
    static String[] lang=new String[2];

    public SrcAndTargLangInput(){
        ok = new JButton("Ok");
        ok.setBounds(150,150,100,50);


        frame = new JFrame();
        frame.getContentPane().setLayout(null);

        frame.getContentPane().add(ok);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        Insets ins = frame.getInsets();
        frame.setSize(400+ins.left+ins.right, 200+ins.bottom+ins.top);
        setSrcLang=new JLabel("Source Language");
        frame.getContentPane().add(setSrcLang);
        setSrcLang.setBounds(50, 50, 100, 40);
        setTargLang=new JLabel("Target Language");
        frame.getContentPane().add(setTargLang);
        setTargLang.setBounds(50, 100, 100, 40);
        String[] srcLangList={"English","Spanish","French"};
        sourcLang = new JComboBox(srcLangList);
        frame.getContentPane().add(sourcLang);
        sourcLang.setBounds(250,50,100,40);
        String[] targLangList={"English","Spanish","French"};
        targLang = new JComboBox(targLangList);
        frame.getContentPane().add(targLang);
        targLang.setBounds(250,100,100,40);
        frame.setVisible(true);
        ok.addActionListener(this);

    }
    public static String[] langInfo(){
        SrcAndTargLangInput ob = new SrcAndTargLangInput();
        return lang;
    }

    public void actionPerformed(ActionEvent e){
        lang[0]=(sourcLang.getSelectedItem().toString());
        lang[1]=(targLang.getSelectedItem().toString());
        frame.setVisible(false);
    }
}
调用函数是:

String[] lg = new String[2];
lg = io.SrcAndTargLangInput.langInfo();
System.out.println(lg[0]);
System.out.println(lg[1]);

在代码中,可以添加默认值为false的布尔变量

在actionPerformed方法中,将该值设置为true。更新logInfo方法,使线程休眠,直到不执行任何操作为止。请看下面的代码

import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Insets; 
import java.io.FileNotFoundException;

public class SrcAndTargLangInput implements ActionListener {
    public static JFrame frame;
    public static JComboBox sourcLang;
    public static JComboBox targLang;
    public static JLabel setSrcLang;
    public static JLabel setTargLang;
    public static JButton ok;
    static String[] lang=new String[2];
    boolean actionPerformed = false;

    public SrcAndTargLangInput(){
        ok = new JButton("Ok");
        ok.setBounds(150,150,100,50);


        frame = new JFrame();
        frame.getContentPane().setLayout(null);

        frame.getContentPane().add(ok);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        Insets ins = frame.getInsets();
        frame.setSize(400+ins.left+ins.right, 200+ins.bottom+ins.top);
        setSrcLang=new JLabel("Source Language");
        frame.getContentPane().add(setSrcLang);
        setSrcLang.setBounds(50, 50, 100, 40);
        setTargLang=new JLabel("Target Language");
        frame.getContentPane().add(setTargLang);
        setTargLang.setBounds(50, 100, 100, 40);
        String[] srcLangList={"English","Spanish","French"};
        sourcLang = new JComboBox(srcLangList);
        frame.getContentPane().add(sourcLang);
        sourcLang.setBounds(250,50,100,40);
        String[] targLangList={"English","Spanish","French"};
        targLang = new JComboBox(targLangList);
        frame.getContentPane().add(targLang);
        targLang.setBounds(250,100,100,40);
        frame.setVisible(true);
        ok.addActionListener(this);

    }
    public static String[] langInfo() throws InterruptedException{
        SrcAndTargLangInput ob = new SrcAndTargLangInput();
        while(!ob.actionPerformed) {
            Thread.sleep(1000);
        }
        return lang;
    }

    public void actionPerformed(ActionEvent e){
        lang[0]=(sourcLang.getSelectedItem().toString());
        lang[1]=(targLang.getSelectedItem().toString());
        actionPerformed = true;
        frame.setVisible(false);
        Thread.currentThread().interrupt();
    }
}
根据这些线:

String[] lg = new String[2];
lg = io.SrcAndTargLangInput.langInfo();
问题是您的
srcandTargetLangInput
类使用
JFrame
请求用户输入。话虽如此,
JFrame
不是模态的,因此它不会阻止当前线程按照您的意愿等待输入。您必须使用模式
JDialog
JOptionPane
(显示模式对话框)来等待用户确认输入

请看以下主题:

离题 正如许多开发人员已经说过的,Swing设计用于,您应该避免使用诸如
setBounds()
setLocation()
setSize()
之类的方法。您可能也想看看这些主题:

示例(使用JOptionPane) 请注意,在确认输入之前,文本字段的文本不会更改

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Demo {

    private void createAndShowGui() {

        final JTextField textField = new JTextField(10);
        textField.setEditable(false);

        JButton button = new JButton("Show dialog");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JComboBox languagesComboBox = new JComboBox(new Object[]{"English","Spanish","French"});
                JPanel dialogPanel = new JPanel();
                dialogPanel.add(new JLabel("Please select an option:"));
                dialogPanel.add(languagesComboBox);

                int option = JOptionPane.showConfirmDialog(null, dialogPanel, "Select an input"
                                                        , JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

                if(option == JOptionPane.OK_OPTION) {
                    String selectedInput = (String)languagesComboBox.getSelectedItem();
                    textField.setText(selectedInput);
                }
            }
        });


        JPanel content = new JPanel();
        content.add(new JLabel("User input:"));
        content.add(textField);
        content.add(button);

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Demo().createAndShowGui();
            }
        }); 
    }

}

你能听一听按钮按下的事件,让它调用函数吗?这是正常的方法。为什么要在
io.SrcAndTargLangInput.langInfo()中添加io?您以错误的方式实现了它。请将侦听器添加到组合框中,并在侦听器内执行帧更新。@shekharsuman io是我从其他包的类调用此方法的包名。不要使用静态变量!!!不要使用setBounds()。您不应该使用空布局。Swing设计用于布局管理器!您的代码中有两个错误,第一个错误是不建议使用
null布局
,而是建议使用。第二,避免使用
Thread.sleep()
而改用。另外,对于
ActionListeners
来说,在事情发生之前不要使用计时器,而是使用事件。这适用于OP:先生,我使用了上面的代码,但代码仍然无法停止。你说的“无法停止”到底是什么意思?你能编辑你的问题并添加你尝试过的内容吗@用户3786574