Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 暂停并等待按钮被单击,然后继续_Java_Multithreading_Swing - Fatal编程技术网

Java 暂停并等待按钮被单击,然后继续

Java 暂停并等待按钮被单击,然后继续,java,multithreading,swing,Java,Multithreading,Swing,我正在尝试建立一个简单的Tictatcoe网络游戏。我需要程序等待玩家移动,然后继续。在代码底部的whileConnected()函数中,我有一个while(true)循环,该循环应该永远运行,并在按下按钮时显示一条确认消息(这是由字符串变量“message”的内容更改发出的信号) 问题是,即使单击按钮时字符串消息变量发生更改,my whileConnected()函数也永远不会实现这一点,函数中的if语句也永远不会计算为true。ButtonListener类中相同的if语句可以正常工作,并显

我正在尝试建立一个简单的Tictatcoe网络游戏。我需要程序等待玩家移动,然后继续。在代码底部的whileConnected()函数中,我有一个while(true)循环,该循环应该永远运行,并在按下按钮时显示一条确认消息(这是由字符串变量“message”的内容更改发出的信号)

问题是,即使单击按钮时字符串消息变量发生更改,my whileConnected()函数也永远不会实现这一点,函数中的if语句也永远不会计算为true。ButtonListener类中相同的if语句可以正常工作,并显示所需的确认消息

我怎样才能解决这个问题?我读了又读,我的想法是我应该使用线程(我读过关于线程的文章,但我以前从未使用过线程,这就是为什么这只是一个猜测)。我需要线吗?有人能简单地解释一下这个具体问题应该使用的原则吗?(如何使程序暂停直到单击按钮,然后继续使用单击按钮时创建的相关信息)。一个代码示例将真正减轻我对线程的阅读——对于初学者来说,这是一个非常抽象的主题

下面是我的代码,提前谢谢

public class Test extends JFrame
{
    private Container contentPane;
    private JButton btn00;
    private static String message = "";

    private class ButtonListener implements ActionListener
    {

        @Override
        public void actionPerformed(ActionEvent e)
        {
            String buttonText = e.getActionCommand();

            if (buttonText.equals("My Button"))
            {
                message = "pressed";
                if (message != "")
                    System.out.println(message+"(executed by ButtonListener)");
            }           
        }

    }

    public Test()
    {
        this.contentPane = this.getContentPane();
        btn00 = new JButton("My Button");
        btn00.setSize(btn00.getPreferredSize());
        btn00.setLocation(20,20);
        ButtonListener listener = new ButtonListener();
        btn00.addActionListener(listener);

        // configure frame
        this.setSize(300,300);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        // make panel
        JPanel panel = new JPanel();
        panel.setSize(200,200);
        panel.setLocation(10,10);
        panel.add(btn00);
        this.contentPane.add(panel);        
    }

    public static void main(String[] args)
    {
        Test gui = new Test();
        gui.setVisible(true);
        // connected
        whileConnected();

    }

    private static void whileConnected()
    {
        System.out.println("message is at first empty: "+message);
        while (true)
        {
            // the if below never evaluates to true... why?

            if (message != "") // this is never true
                System.out.println(message+"(executed by whileConnected)");         
        }

    }

}

如果您正在使用swing,那么您已经在使用线程了。Swing本质上有一个用于I/O的线程和一个用于后端的线程。您确实希望在这里使用线程——除其他外,将线程置于等待状态比给它一个无限循环进行搅动要便宜得多


侦听器是线程的另一个应用程序,如果您只需要使用构造良好的侦听器就可以获得所需的大部分或全部内容,我不会感到惊讶。另外,还有一些东西叫做信号量。信号量是线程处理计时的一种方式——如果一个线程试图锁定一个已经锁定的信号量,它将等待另一个线程解锁它后再继续(并再次锁定)。在您的情况下,您可以尝试以下方法

  • 有一个按钮侦听器、一个主函数和一个锁定的信号量
  • Main函数启动,执行任何初始行为,并尝试获取信号量。因为信号量已经被锁定,所以它保持不变
  • 当按钮侦听器启动时,它所做的一件事就是解锁信号量
  • 一旦信号量解锁,主函数就会抓住它(从而再次锁定它),并执行它应该执行的任何操作。最后,它完成了这个操作,并再次尝试获取(锁定的)信号量,从而等待按钮侦听器下次启动
  • 重复一遍
编辑:包括并解释实际接受的解决方案(来自下面的评论)

修正:添加
Thread.sleep(1000)到whileConnected函数中while循环的内部


说明:while循环是一个无限循环,它只包含if语句。在很长一段时间内(至少就计算机而言),此if语句的计算结果为false(因此不起任何作用)。这与电短路的作用方式大致相同——没有任何东西可以减慢它的速度,因此运行主功能的线程会在不做任何事情的情况下消耗大量计算资源。这很糟糕。有可能是某些故障保护启动并终止了线程。这根线有可能以更丑陋的方式断裂或断裂。在任何情况下,包括一个sleep语句(在本例中,每个循环睡眠一秒钟,以毫秒为单位)都可以防止这种情况发生,从而允许函数无限期地继续运行。

如果您使用的是swing,那么您已经在使用线程了。Swing本质上有一个用于I/O的线程和一个用于后端的线程。您确实希望在这里使用线程——除其他外,将线程置于等待状态比给它一个无限循环进行搅动要便宜得多


侦听器是线程的另一个应用程序,如果您只需要使用构造良好的侦听器就可以获得所需的大部分或全部内容,我不会感到惊讶。另外,还有一些东西叫做信号量。信号量是线程处理计时的一种方式——如果一个线程试图锁定一个已经锁定的信号量,它将等待另一个线程解锁它后再继续(并再次锁定)。在您的情况下,您可以尝试以下方法

  • 有一个按钮侦听器、一个主函数和一个锁定的信号量
  • Main函数启动,执行任何初始行为,并尝试获取信号量。因为信号量已经被锁定,所以它保持不变
  • 当按钮侦听器启动时,它所做的一件事就是解锁信号量
  • 一旦信号量解锁,主函数就会抓住它(从而再次锁定它),并执行它应该执行的任何操作。最后,它完成了这个操作,并再次尝试获取(锁定的)信号量,从而等待按钮侦听器下次启动
  • 重复一遍
编辑:包括并解释实际接受的解决方案(来自下面的评论)

修正:添加
Thread.sleep(1000)到whileConnected函数中while循环的内部

说明:while循环是一个无限循环,它只包含if语句。在很长一段时间内(至少就计算机而言),此if语句的计算结果为false(因此不起任何作用)。这与电短路的作用方式大致相同——没有任何东西可以减慢它的速度,因此运行主功能的线程会在不做任何事情的情况下消耗大量计算资源。这很糟糕。有可能是某些故障保护启动并终止了线程。这根线有可能以更丑陋的方式断裂或断裂。在任何情况下,包括一个sleep语句(在本例中,每个循环睡眠一秒钟,以m为单位)