0

我希望它保持打开状态并等待事件发生,但是一旦打开它就会关闭,我该如何解决这个问题?

    静态无效嗨()
    {
        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()

4

2 回答 2

1

您无需创建任何窗口来获取事件。你的main函数是空的,所以你的程序什么都不做:它的进程在启动后关闭。

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

有关详细信息,请参阅如何编写关键侦听器

于 2013-11-12T18:23:08.927 回答
0

我假设您已从教程中复制了此代码?有几件事不见了。正如 Alexey 所提到的,“main”方法是程序的入口点,如果您的 main 方法中没有代码,那么您的程序什么也不做。您应该做一些事情,例如创建一个新线程、框架、窗口等,无论您希望关键侦听器附加到什么。

在创建一个永远运行的线程的更广泛的背景下,你可以做类似的事情

while(true) {
    Thread.sleep(100);
}

尽管您可能希望将 'true' 更改为 'myflag' 可以从代码中的其他位置设置以终止线程。

于 2013-11-12T18:30:11.337 回答