jline ให้แจ้งที่ด้านล่าง

ฉันใช้ jline และฉันมี ConsoleReader ที่เรียบร้อย และทุกอย่างทำงานได้ดีมาก อย่างไรก็ตาม หากคุณกำลังพิมพ์บางอย่างลงในพรอมต์และมีเอาต์พุตบน stdout (จากเธรดอื่น) เอาต์พุตจะแยกคำ/คำสั่งที่คุณกำลังพิมพ์

ฉันจะเก็บข้อความแจ้ง jline ไว้ที่ด้านล่างของเทอร์มินัลได้อย่างไร

ฉันใช้ jline 1 แต่ฉันเปิดให้ใช้ jline 2 ถ้ามันเสถียรเพียงพอ


person Alec Gorge    schedule 25.01.2012    source แหล่งที่มา
comment
ห้องสมุดได้รับการออกแบบโดยอ้างว่าเพื่อจัดการกับอินพุตคอนโซล ฉันไม่เห็นว่ามันจะจัดการเอาต์พุตคอนโซลได้อย่างไร ปัญหาคือเหตุการณ์ I/O ของคอนโซลเป็นแบบอะซิงโครนัส (ในกรณีของคุณ) บางที คุณอาจต้องจัดเก็บเอาต์พุตคอนโซลไว้ในบัฟเฟอร์ชั่วคราวขณะดำเนินการอินพุต และแสดงเอาต์พุตจากบัฟเฟอร์เมื่ออินพุตเสร็จสิ้น   -  person ee.    schedule 26.01.2012
comment
บางทีคุณอาจต้องค้นหาไลบรารี Curses สำหรับ Java sourceforge.net/projects/javacurses, sourceforge.net/projects/enigma-shell หรือ javaworld.com/javaworld/javaqa/2002-12/02-qa-1220-console.html ซึ่งช่วยให้คุณเปลี่ยนตำแหน่งเคอร์เซอร์อินพุต/เอาท์พุตคอนโซลของคุณได้   -  person ee.    schedule 26.01.2012


คำตอบ (1)


ในที่สุดก็คิดออก... นี่คือสิ่งที่คุณทำ ขั้นแรก ให้กำหนดฟังก์ชันเหล่านี้:

private ConsoleReader console = ...;
private CursorBuffer stashed;

private void stashLine() {
    this.stashed = this.console.getCursorBuffer().copy();
    try {
        this.console.getOutput().write("\u001b[1G\u001b[K");
        this.console.flush();
    } catch (IOException e) {
        // ignore
    }
}

private void unstashLine() {
    try {
        this.console.resetPromptLine(this.console.getPrompt(),
          this.stashed.toString(), this.stashed.cursor);
    } catch (IOException e) {
        // ignore
    }
}

จากนั้นเมื่อคุณต้องการเอาท์พุตข้อมูลใหม่ อันดับแรกให้เรียกใช้ stashLine() เพื่อบันทึกอินพุตคอนโซลปัจจุบัน จากนั้นจึงเอาท์พุตบรรทัดใหม่ของเอาต์พุต จากนั้นจึงเรียกใช้ unstashLine() เพื่อกู้คืน

person Archie    schedule 09.12.2014
comment
ท่านสมควรได้รับเหรียญรางวัล - person Joa Ebert; 17.12.2014