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

时间:2013-11-12 18:17:01

标签: 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 e) { // TODO Auto-generated method stub } @Override public void KeyTyped(KeyEvent e) { // TODO Auto-generated method stub } <code>

编辑:当我按下一个按键时,即使我确实有一个框架,它也不会运行hi()

2 个答案:

答案 0 :(得分:1)

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

查看Creating a GUI with Swing教程。您可以在Compiling and Running Swing Programs部分找到最简单的 Hello World GUI应用程序,请参阅HelloWorldSwing.java


创建框架是不够的:您必须在框架或其他组件上注册KeyListener。这是完整的例子:

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不是线程安全的,并且必须在事件调度线程(EDT)上执行对GUI组件的所有修改。所以invokeLater安排了EDT的工作;结果PressKey.run()将在EDT上运行:它是我们创建框架并注册附加到框架的KeyListener,然后我们显示框架。当屏幕上显示框架时,按任意键:您将在控制台中看到相应的字符。如果按功能键或其他不生成输入字符的键,则不会看到任何打印内容,因为在这种情况下不会生成KeyEvent.KEY_TYPED

有关详细信息,请参阅How to Write a Key Listener

答案 1 :(得分:0)

我假设你已经从教程中复制了这段代码?有几件事情遗失了。正如Alexey所提到的,'main'方法是程序的入口点,如果你的main方法中没有代码,那么你的程序什么都不做。您应该做一些事情,比如创建一个新的线程,框架,窗口等等,无论您希望关键的监听器能够附加什么。

在创建永久运行的线程的更广泛的上下文中,您可以执行类似

的操作
while(true) {
    Thread.sleep(100);
}

虽然您可能希望将“true”更改为“myflag”,可以从代码中的其他位置设置以终止该线程。