JTextField:记录来自终端的输入历史记录

时间:2014-10-22 06:13:26

标签: java swing

我想开发一个可能包含文本字段的Swing应用程序,它将像终端一样(来自Unix / Linux系统的控制台)。

每当用户输入命令时,它将保存到容器中,然后通过向上或向下箭头( / )进行访问。

我知道这是可能的,但我仍然没有正确实施它的想法。我的第一个实现是将命令存储到单个文本文件中,然后以相反的顺序访问它,以便首先检索最后一个输入。

我的问题是如何知道我是否在指定的索引中(例如2 箭头将进入文件的长度为2的索引)。

1 个答案:

答案 0 :(得分:3)

一个非常基本的例子,但工作正常。你可以在输入时输入用户输入并将它们添加到像arraylist这样的集合中。在这个例子中使用向量.i用户点击输入将它们存储在集合中并在用户按下时( / ),从中取回并在textarea中显示。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.text.BadLocationException;

public class terminal extends JFrame {

    Vector v = new Vector();
    JTextArea area;
    int pos = 0;

    public terminal() {
        setTitle("my terminal");
        JPanel j = new JPanel();
        setLayout(new GridLayout(1, 1));
        setSize(400,250);
        j.setLayout(new GridLayout(1, 1));
        area = new JTextArea("terminal");
        area.setBackground(Color.black);
        area.setForeground(Color.white);
        area.setCaretColor(Color.white);
        area.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                area(evt);
            }

            private void area(KeyEvent evt) {
                int keyCode = evt.getKeyCode();
                if (keyCode == 38) {
                    try {
                        String store = (String) v.get(v.size() - 1 - pos);
                        replacer(store);
                    } catch (Exception ex) {
                        //ex.printStackTrace();
                    }
                    pos++;
                    evt.consume();
                } else if (keyCode == 40) {
                    try {
                        String store = (String) v.get(v.size() - 1 - pos);
                        replacer(store);
                    } catch (Exception ex) {
                        //ex.printStackTrace();
                    }
                    pos--;
                    evt.consume();
                } else if (keyCode == 10) {
                    v.add(linetext());
                }
            }
        });
        j.add(area);
        add(j);
        setVisible(true);
    }

    void replacer(String rep) {

        try {
            int caretOffset = area.getCaretPosition();
            int lineNumber = area.getLineOfOffset(caretOffset);
            int startOffset = area.getLineStartOffset(lineNumber);
            int endOffset = area.getLineEndOffset(lineNumber);

            area.replaceRange(rep, startOffset, endOffset);
        } catch (BadLocationException ex) {
           //ex.printStackTrace();
        }
    }

    String linetext() {
        String text = null;
        try {
            JTextArea ta = area;
            int offset = ta.getLineOfOffset(ta.getCaretPosition());
            int start = ta.getLineStartOffset(offset);
            int end = ta.getLineEndOffset(offset);
            text = ta.getText(start, (end - start));
        } catch (BadLocationException ex) {
            //ex.printStackTrace();
        }
        return text;

    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                terminal terminal = new terminal();
            }
        });
    }
}

输出>>

enter image description here