Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 - Fatal编程技术网

Java 如何使程序在等待事件时保持打开状态

Java 如何使程序在等待事件时保持打开状态,java,Java,我希望它保持打开状态并等待事件发生,但一旦它打开,它就会关闭。如何解决此问题? static void hi() { System.out.println("g"); } public static void main(String[] args) { } @Override public void KeyPressed(KeyEvent e) { hi(); } @Override public void KeyReleased(KeyEvent

我希望它保持打开状态并等待事件发生,但一旦它打开,它就会关闭。如何解决此问题?
static void hi() { System.out.println("g"); }

public static void main(String[] args)
{

}
@Override
public void KeyPressed(KeyEvent e) {
    hi();

}
@Override
public void KeyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

}
@Override
public void KeyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}  <code>

编辑:即使我有一个帧,也要等待。当我按下某个键时,它不会运行hi()

您不会创建任何窗口来获取事件。您的
main
函数为空,因此您的程序不执行任何操作:其进程在启动后关闭

请看教程。您将在第节中找到最简单的Hello World GUI应用程序,请参阅


仅仅创建一个框架是不够的:您必须在框架或其他组件上注册
keylister
。以下是完整的示例:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class PressKey implements KeyListener, Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new PressKey());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Press a key");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.addKeyListener(this);

        frame.setSize(300, 150);
        frame.setVisible(true);
    }

    @Override
    public void keyPressed(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyTyped(KeyEvent e) {
        System.out.println("Key pressed: " + e.getKeyChar());
    }
}
它是如何工作的?函数
main
创建
PressKey
类的实例,并将其传递给
SwingUtilities.invokeLater
实用方法。这是必需的,因为Swing不是线程安全的,对GUI组件的所有修改都必须在事件调度线程(EDT)上执行。因此,
invokeLater
将作业调度到EDT;因此,
PressKey.run()
将在EDT上运行:我们在EDT上创建帧并注册附加到帧的
KeyListener
,然后显示帧。当画面显示在屏幕上时,按任意键:您将看到控制台中打印的相应字符。如果您按下一个功能键或另一个不生成输入字符的键,您将看不到任何打印内容,因为在这种情况下,不会生成
KeyEvent.key\u TYPED


有关更多信息,请参阅。

我假设您从教程中复制了此代码?缺少了一些东西。正如Alexey提到的,“main”方法是程序的入口点,如果主方法中没有代码,那么程序什么也不做。你应该做一些事情,比如创建一个新的线程、框架、窗口等等,不管你想让你的关键侦听器连接到什么

在创建一个永远运行的线程的更广泛的上下文中,您可以执行以下操作

while(true) {
    Thread.sleep(100);
}
尽管您可能希望将“true”更改为“myflag”,这可以从代码中的其他位置设置以终止线程