Java 如何存储JTextField中的值并将其与线程一起使用?
我正在尝试做一个简单的GUI程序,在这个程序中,您必须在JTextField中输入一个数字,然后按一个JButton,用户输入的数字将在GUI中生成新的JTextFields。我面临“AWT-EventQueue-0”的问题。我读了很多关于它的书,但是没有一本对我有帮助 我的代码:Java 如何存储JTextField中的值并将其与线程一起使用?,java,multithreading,user-interface,actionlistener,runnable,Java,Multithreading,User Interface,Actionlistener,Runnable,我正在尝试做一个简单的GUI程序,在这个程序中,您必须在JTextField中输入一个数字,然后按一个JButton,用户输入的数字将在GUI中生成新的JTextFields。我面临“AWT-EventQueue-0”的问题。我读了很多关于它的书,但是没有一本对我有帮助 我的代码: import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Test2 extends JFrame implements Runnable, ActionListener{
private JTextField txtThread;
private JButton btn1;
private JTextField [] bookSeat;
private String name;
public int numFirst;
public Test2() {
//Setting the layout.
setLayout(new FlowLayout());
txtThread = new JTextField(); //"Number of threads"
txtThread.setColumns(5);
add(txtThread);
btn1 = new JButton("Create threads");
add(btn1);
btn1.addActionListener(this);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
}
//A method for creating a number of threads depending on the user wish.
public void createSeat() {
numFirst = Integer.parseInt(txtThread.getText().trim());
bookSeat = new JTextField[numFirst];
name = Thread.currentThread().getName();
//for loop for adding the new JTextFields into the GUI.
for(int i = 0; i < numFirst; i++) {
bookSeat[i] = new JTextField("Thread " + name);
bookSeat[i].setBackground(Color.RED);
bookSeat[i].setEditable(false);
add(bookSeat[i]);
setVisible(true);
}
}
@Override
public void run() {
name = Thread.currentThread().getName();
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(btn1)) {
createSeat();
}
}
public static void main(String [] args) {
Test2 gui = new Test2();
try {
for(int i = 0; i < gui.numFirst; i++) {
Thread a = new Thread(gui, "" + i);
Thread.currentThread().sleep(1000);
a.start();
}
}catch (InterruptedException e) {}
}
}
导入java.awt.Color;
导入java.awt.FlowLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JTextField;
公共类Test2扩展了JFrame,实现了可运行的ActionListener{
私有JTextField txthread;
私人按钮btn1;
私有JTextField[]bookSeat;
私有字符串名称;
公共int numFirst;
公共测试2(){
//设置布局。
setLayout(新的FlowLayout());
txtThread=new JTextField();/“线程数”
txtThread.setColumns(5);
添加(TXT线程);
btn1=新的JButton(“创建线程”);
添加(btn1);
btn1.addActionListener(本);
setExtendedState(JFrame.MAXIMIZED_两者);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
可设置大小(假);
}
//一种根据用户意愿创建多个线程的方法。
公众席(){
numFirst=Integer.parseInt(txthread.getText().trim());
bookSeat=newjtextfield[numFirst];
name=Thread.currentThread().getName();
//for循环,用于将新JTextFields添加到GUI中。
for(int i=0;i
我的问题在main方法中,特别是在for循环条件中
for(int i=0;i1) Swing不是线程安全的;2) Swing是单线程的。这是什么意思?您不应该从事件调度线程外调用任何与UI相关的功能,也不应该从EDT内执行任何阻塞操作。3) Swing是事件驱动的。这意味着有些事情发生了,然后你对它做出反应。事情不是以线性流程运行OK,所以您的问题是,
createSet
在EDT的上下文中被调用(即Thread AWT-EventQueue-0
)。老实说,您的for(int i=0;i
是无用和无意义的,因为当您检查numFirst
的值时,用户还没有输入任何内容(还记得关于“事件驱动”的注释),那么我如何从JTextField存储输入的值并在for循环中使用它呢?因为我仍然需要这个数字来确定我想要创建的线程的数量。当知道这个数字时就去做——这是执行操作的结果