簡體   English   中英

使用JCurses從鍵盤讀取而不按“ Enter”鍵

[英]Reading from keyboard without pressing “enter” using JCurses

我正在編寫一個應用程序,要求我從控制台讀取鍵,而不必等待用戶按下Enter鍵。 我讀過JCurses庫可以提供幫助。

我嘗試像這樣使用Toolkit.readCharacter()

InputChar c = Toolkit.readCharacter();
system.out.println(c.getCharacter());

但是問題是無論您輸入多少字符, readCharacter()方法都不會結束執行。 即使您按Enter鍵,似乎仍在等待您輸入字符。

對於使用JCurses的任何幫助或其他任何方式,我都非常感謝。

Java Curses有幾種特定的按鍵識別方法,但是將您自己綁定到單個函數的外部庫可能不是最佳解決方案。

通過創建終端樣式的Swing應用程序並使用KeyListener來檢測擊鍵事件,可以實現目標。 但是,MadProgrammer在“ 如何使esc停止”方法中指出,這種解決方案可能會出現“焦點問題”。

因此,如果您想跟蹤特定的擊鍵,或希望基於不同的用戶輸入來影響程序行為,我建議您使用作為Swing的一部分實現的鍵綁定

例如

component.getInputMap(WHEN_IN_FOCUSED_WINDOW).put
    (KeyStroke.getKeyStroke("F1"),"actionName");
component.getActionMap().put("actionName", yourAction);

其中component是任何JComponent對象(可能是終端顯示),而yourAction是任何Swing操作。 對於“控制台”應用程序,最好使用此處所示的getInputMap()的參數化形式,因為用戶必須在頂級窗口內進行擊鍵,因此組件焦點無關緊要。

這個程序對我有用。
您需要調用Toolkit.init()將終端置於cbreak()模式。 並記得在退出前調用Toolkit.shutdown()

有幾個缺點。

  • jcurses自動將tty置於cbreak模式,而jcurses沒有提供直接操作curses庫的方法。
  • 一旦進入jcurses,輸出將處於cbreak模式,並且來自Java的直接字符串具有換行符,但不會返回任何回車符。
  • jcurses的開發人員僅實現了擁有整個屏幕的curses部分。 如果您想要的只是cbreak模式,jcurses似乎會顯得過大。

該程序。

import jcurses.system.CharColor;
import jcurses.system.InputChar;
import jcurses.system.Toolkit;

public class itest 
{

    public static void main(String[] args) 
    {
        int y = 0;
        CharColor color = new CharColor(CharColor.BLACK, CharColor.WHITE);
        Toolkit.init();
        while (true) {
            InputChar c = Toolkit.readCharacter();
            if ('q' == c.getCharacter())
                break;
            Toolkit.printString(String.format("c : %c", c.getCharacter()), 0, y++, color);
        }
        Toolkit.shutdown();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM