Java 防止代码在用户输入前返回值
我有以下代码通过JCombo框从用户那里获得2个输入,然后,我将获得的输入值s返回给调用函数,但问题是,此代码显示获取用户输入的帧,但在用户可以按下“Ok”按钮之前,它会将空值返回给调用函数。我希望在此方法中停止代码,直到用户按下“Ok”按钮。 请提出一些建议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
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
(显示模式对话框)来等待用户确认输入
请看以下主题:
setBounds()
、setLocation()
或setSize()
之类的方法。您可能也想看看这些主题:
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