创建 java swing 应用程序以仅在按下 ctrl+c 时显示 GUI

Create java swing application to display GUI only when ctrl+c is pressed

我想创建一个 Java swing 应用程序,它 仅在按下 Ctrl+C 时加载 GUI

当我启动应用程序时,它应该监视键盘事件,以便在按下 Ctrl+C 时显示 GUI (JFrame)。在按下 Ctrl+C 之前,我不想显示 GUI 的任何部分。

我无法找到如何在实现任何 GUI 组件之前关联键盘事件。是否可以显示 JFrameframe.setVisible(true) 有条件地键盘捕获 ?

您可以使用 Runtime.addShutdownHook(Thread hook).

Ctrl + C 启动 SIGINT,这将导致 JVM 关闭,然后将调用您的钩子。然后你可以添加一些带条件的循环(在需要时完成 JVM 关闭)和 Thread.sleep().

作为另一种选择,您可以使用来自 sun.misc 软件包的 Sun Signal class。

SignalHandler handler = (_) -> {
    JFrame jFrame = new JFrame("Title");
    jFrame.setVisible(true);
};

Signal.handle(new Signal("INT"), handler);

编辑 要捕获整个系统的组合键,您可以使用 jkeymaster lib.

在 Linux/Unix

this page 的帮助下:

// Setting console to raw mode
String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();

// Getting input stream
Console console = System.console();
Reader reader = console.reader();

// Checking if input is ^C
char c=0;
while(c!=3) { // 3 = ^C
    c=(char)reader.read();
}
// ^C is entered

// Reset console to normal mode
cmd = new String[] {"/bin/sh", "-c", "stty sane </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();   

// Initialize frame
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(3);
frame.setSize(400,200);
frame.setLocationRelativeTo(null);
frame.setTitle("Why are you leaving me ?");
frame.setVisible(true);

在 Windows/Macintosh

Java 自己的库似乎不可能。 JLine could work as described here 使用此代码:

ConsoleReader reader = new ConsoleReader();
char c=0;
while(c!=3) {
    c=(char)reader.readVirtualKey();
}
// Frame stuff here



我认为评论解释了您需要的一切。如果没有,请告诉我!

旁注:如果你在 Eclipse 中 运行 这个你会在 Reader reader=console.reader() 得到一个 NPE,因为 Eclipse 就是这样 运行它的程序;没有控制台。