Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何存储JTextField中的值并将其与线程一起使用?_Java_Multithreading_User Interface_Actionlistener_Runnable - Fatal编程技术网

Java 如何存储JTextField中的值并将其与线程一起使用?

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.

我正在尝试做一个简单的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.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;i gui.numFirst总是给我0。我尝试了多种方法来存储我在JTextField中输入的值,但是我无法


1) Swing不是线程安全的;2) Swing是单线程的。这是什么意思?您不应该从事件调度线程外调用任何与UI相关的功能,也不应该从EDT内执行任何阻塞操作。3) Swing是事件驱动的。这意味着有些事情发生了,然后你对它做出反应。事情不是以线性流程运行OK,所以您的问题是,
createSet
在EDT的上下文中被调用(即
Thread AWT-EventQueue-0
)。老实说,您的
for(int i=0;i
是无用和无意义的,因为当您检查
numFirst
的值时,用户还没有输入任何内容(还记得关于“事件驱动”的注释),那么我如何从JTextField存储输入的值并在for循环中使用它呢?因为我仍然需要这个数字来确定我想要创建的线程的数量。当知道这个数字时就去做——这是执行
操作的结果