我想开发一个可能包含文本字段的Swing应用程序,它将像终端一样(来自Unix / Linux系统的控制台)。
每当用户输入命令时,它将保存到容器中,然后通过向上或向下箭头(↑ / ↓)进行访问。
我知道这是可能的,但我仍然没有正确实施它的想法。我的第一个实现是将命令存储到单个文本文件中,然后以相反的顺序访问它,以便首先检索最后一个输入。
我的问题是如何知道我是否在指定的索引中(例如2 ↑箭头将进入文件的长度为2的索引)。
答案 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();
}
});
}
}
输出>>