创建 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 组件之前关联键盘事件。是否可以显示 JFrame
即 frame.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 就是这样 运行它的程序;没有控制台。
我想创建一个 Java swing 应用程序,它 仅在按下 Ctrl+C 时加载 GUI。
当我启动应用程序时,它应该监视键盘事件,以便在按下 Ctrl+C
时显示 GUI (JFrame
)。在按下 Ctrl+C
之前,我不想显示 GUI 的任何部分。
我无法找到如何在实现任何 GUI 组件之前关联键盘事件。是否可以显示 JFrame
即 frame.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 就是这样 运行它的程序;没有控制台。