【问题标题】:Create java swing application to display GUI only when ctrl+c is pressed创建 java swing 应用程序以仅在按下 ctrl+c 时显示 GUI
【发布时间】:2015-01-05 19:41:52
【问题描述】:

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

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

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

【问题讨论】:

  • 你可能想看看key bindings
  • @TNT 你需要一个 JComponent,但它不可用(目前)。
  • @Charlie Right...忘记了 JFrame 不扩展 JComponent。
  • @TNT 即使有,它也没有任何焦点(因为它不可见),所以它不会注册任何键。在 sks,我认为您需要在 while 循环中使用 raw input 来检查 CTRL+C。
  • 我的应用程序的目的是将它作为 Windows 桌面应用程序运行,它将像任何其他 Windows 应用程序一样继续运行,并且每当用户尝试使用 ctrl+c 从其他窗口复制任何内容时,我的应用程序应该捕获事件并在我的应用程序的 GUI 中显示复制的内容。

标签: java swing keyboard jframe copy-paste


【解决方案1】:

在 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 可以使用此代码 as described here

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



我认为 cmets 可以解释您所需要的一切。如果没有,请告诉我!

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

【讨论】:

  • 如果是 Windows 怎么办?:)
  • @pbespechnyi 已编辑帖子
  • 它打算成为一个windows应用程序:) 顺便问一下,Swing内置的其他windows应用程序如何捕获键盘事件?如果我将功能键关联为 F12 而不是 ctrl-c 是否有可能?
  • @sks 你可以点击链接,但我在自己的帖子中添加了代码。
  • 是的,看到了最新的代码。谢谢 !!我会尝试运行它并返回。很好的帮助!
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 嗯,然后框架会闪烁,程序会关闭?
  • @Charlie,不,如果您使用例如Thread.sleep,我已经更新了我的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
相关资源
最近更新 更多