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 JFrame在Thread.sleep(int)期间处于非活动状态_Java_Multithreading_Swing_Events_Event Dispatch Thread - Fatal编程技术网

Java JFrame在Thread.sleep(int)期间处于非活动状态

Java JFrame在Thread.sleep(int)期间处于非活动状态,java,multithreading,swing,events,event-dispatch-thread,Java,Multithreading,Swing,Events,Event Dispatch Thread,我有一些Java类可以模拟旧的计算机器。其中一个是JFrame,称为GUI,带有JTabbedPane。计算过程应该需要一些时间,所以我加入了Thread.sleep(int)。问题是,当计算功能工作时,无法选择我的GUI中JTabbedPane的选项卡 下面是一些代码: import java.util.*; import java.awt.*; public class Engine { private GUI gui; private Store store; p

我有一些Java类可以模拟旧的计算机器。其中一个是JFrame,称为GUI,带有JTabbedPane。计算过程应该需要一些时间,所以我加入了Thread.sleep(int)。问题是,当计算功能工作时,无法选择我的GUI中JTabbedPane的选项卡

下面是一些代码:

import java.util.*;
import java.awt.*;

public class Engine
{
    private GUI gui;
    private Store store;
    private Mill mill;

    public static void main(String[] args) {
        Engine e = new Engine();
    }

    public Engine() {
        gui = new GUI(this);
        mill = new Mill(this);
        store = new Store(this);

        store.draw();                       // affects GUI elements
    }

    public void read(String operations) {
        clearStatus();                      // affects GUI elements

        try {
            String[] op = operations.split("\n");

            for (int i = 0; i < op.length; i++) {
                setStatus(op[i]);        // affects GUI elements

                if (op[i].length() == 0) {  // empty line
                    continue;
                }

                int number = Integer.parseInt(op[i]);
                store.addNumber(number);

                Thread.sleep(200);
            }

            store.draw();                   // affects GUI elements

        } catch(Exception e) {
            System.out.println(e);
        }
    }

    public void clearStatus() {
        gui.statusLabel.setText("");
    }

    public void setStatus(String msg) {
        gui.statusLabel.setText(msg);
    }
}

@sorifiend的意思是,从事件处理程序调用
sleep()
,将“锁定”应用程序的事件调度线程。在事件处理函数返回之前,应用程序不会响应任何其他用户输入

如果您希望应用程序在计算器“工作”时响应,那么您需要做的是:

  • 记录计算器的状态为“工作”
  • 禁用您不希望用户在计算器“工作”时按下的任何按钮,或者——如果在“工作”状态下按下这些按钮,则更改这些按钮的处理程序以执行不同的操作(模拟干扰机器?)
  • 在不久的将来提交一个计时器事件(无论计算需要多长时间)
  • 在计时器事件的处理程序中,显示计算结果,重新启用禁用的按钮,并将状态从“工作”更改回“空闲”(或其他)

@sorifiend的意思是,从事件处理程序调用
sleep()
将“锁定”应用程序的事件调度线程。在事件处理函数返回之前,应用程序不会响应任何其他用户输入

如果您希望应用程序在计算器“工作”时响应,那么您需要做的是:

  • 记录计算器的状态为“工作”
  • 禁用您不希望用户在计算器“工作”时按下的任何按钮,或者——如果在“工作”状态下按下这些按钮,则更改这些按钮的处理程序以执行不同的操作(模拟干扰机器?)
  • 在不久的将来提交一个计时器事件(无论计算需要多长时间)
  • 在计时器事件的处理程序中,显示计算结果,重新启用禁用的按钮,并将状态从“工作”更改回“空闲”(或其他)

永远不要说出术语
JFrame
Thread.sleep
)sleep将锁定整个线程,如果希望JFrame继续运行,则需要在另一个线程上执行所有模拟代码,并且只将该线程置于睡眠状态。永远不要休眠你的JFrame线程。可能的重复与你的问题并不完全相同,但这是因为同一个问题。基本上,当您在长时间运行的事件调度线程上执行某些操作时,GUI本身是不允许运行的sleep将锁定整个线程,如果希望JFrame继续运行,则需要在另一个线程上执行所有模拟代码,并且只将该线程置于睡眠状态。永远不要休眠你的JFrame线程。可能的重复与你的问题并不完全相同,但这是因为同一个问题。基本上,当你在运行很长时间的事件调度线程上执行某项操作时,GUI本身是不允许运行的。这可能会带来更多麻烦,但另一种可能的解决方法是在用户不应与之交互的区域顶部覆盖一个玻璃窗格,而不是禁用按钮,然后让它使用所有用户鼠标事件,这可能比禁用多个组件更容易。(如果您采用这种方法,请不要忘记使用按键事件,例如可以绕过玻璃窗格的tab键),这会带来更多麻烦,但另一种可能的解决方法是将单个玻璃窗格覆盖在用户不应交互的区域上,然后使其使用所有用户鼠标事件,而不是禁用按钮,这可能比禁用多个组件更容易。(如果采用这种方法,请不要忘记使用按键事件,例如可以绕过玻璃窗格的tab键)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GUI extends JFrame
{
    private Engine engine;

    // Swing
    JTabbedPane tabs;
    JPanel mill;
    JTextArea input, store;
    JLabel statusLabel;
    JButton sendInput;

    public GUI(Engine e)
    {
        engine = e;

        input = new JTextArea();
        sendInput = new JButton("Run");
        sendInput.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                pressInputButton(evt);
            }
        });

        JPanel inputPanel = new JPanel();
        inputPanel.add(input,     BorderLayout.CENTER);
        inputPanel.add(sendInput, BorderLayout.SOUTH);

        mill = new JPanel();
        statusLabel = new JLabel();
        mill.add(statusLabel);

        store = new JTextArea();

        JTextPane helpPane = new JTextPane();
        helpPane.setText("[...]");

        tabs = new JTabbedPane();
        tabs.addTab("Input", inputPanel);
        tabs.addTab("Mill", mill);
        tabs.addTab("Store", new JScrollPane(store));
        tabs.addTab("Help", helpPanel);

        add(tabs, BorderLayout.CENTER);
        setVisible(true);
        pack();
    }

    public void pressInputButton(ActionEvent evt) {
        engine.read(input.getText());
    }
}