Java JTextField:记录输入历史,如来自终端
我想开发一个Swing应用程序,其中可能包含文本字段,其作用类似于终端(Unix/Linux系统的控制台) 每当用户输入命令时,它将保存到容器中,然后通过向上或向下箭头访问(↑/ ↓). 我知道这是可能的,但我仍然没有正确实现它的想法。我的第一个实现是将命令存储到单个文本文件中,然后以相反的顺序访问它,以便首先检索最后的输入Java JTextField:记录输入历史,如来自终端,java,swing,Java,Swing,我想开发一个Swing应用程序,其中可能包含文本字段,其作用类似于终端(Unix/Linux系统的控制台) 每当用户输入命令时,它将保存到容器中,然后通过向上或向下箭头访问(↑/ ↓). 我知道这是可能的,但我仍然没有正确实现它的想法。我的第一个实现是将命令存储到单个文本文件中,然后以相反的顺序访问它,以便首先检索最后的输入 我的问题是如何知道我是否在指定的索引中(例如2↑ 箭头将进入文件的长度2索引)。这是一个非常基本的示例,但工作正常。按enter键时,您可以获取用户输入,并将其添加到arr
我的问题是如何知道我是否在指定的索引中(例如2↑ 箭头将进入文件的长度2索引)。这是一个非常基本的示例,但工作正常。按enter键时,您可以获取用户输入,并将其添加到arraylist、vectors等集合中。我在本例中使用了vector。当用户按enter键时,将其存储在集合中,当用户按(↑/ ↓) ,把它拿回来,在文本区展示
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键时,您可以获取用户输入,并将其添加到arraylist、vectors等集合中。在本例中,我使用了vector。当用户按enter键时,将其存储在集合中,当用户按(↑/ ↓) ,把它拿回来,在文本区展示
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键时,您可以获取用户输入,并将其添加到arraylist、vectors等集合中。在本例中,我使用了vector。当用户按enter键时,将其存储在集合中,当用户按(↑/ ↓) ,把它拿回来,在文本区展示
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键时,您可以获取用户输入,并将其添加到arraylist、vectors等集合中。在本例中,我使用了vector。当用户按enter键时,将其存储在集合中,当用户按(↑/ ↓) ,把它拿回来,在文本区展示
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();
}
});
}
}
输出>>
您的意思是要在两次运行之间存储索引吗?将输入ans存储在一个数组中。使用keyevent使其返回seems这可以使用..@MadProgrammer索引仅用于行代码。@EriezeLagera您不需要文件。您只需要存储命令,直到应用程序关闭。收集足够了,您的意思是要停止吗重新设置运行之间的索引?将输入ans存储在一个数组中。使用keyevent使其返回seem这可能会使用..@MadProgrammer索引仅用于行代码。@EriezeLagera您不需要文件。您只需要存储命令,直到应用程序关闭。集合足够了。您的意思是要在运行之间存储索引吗?使用输入ans存储在一个数组中。使用keyevent使其返回seem这可能会使用..@MadProgrammer索引仅用于行代码。@EriezeLagera您不需要文件。您只需要存储命令,直到应用程序关闭。收集足够了。您的意思是要在两次运行之间存储索引吗?将输入ans存储在一个数组中。使用keyevent让他们回头看这可以使用..@MadProgrammer索引只用于行代码。@EriezeLagera您不需要文件。您只需要存储命令,直到应用程序关闭。集合足以让您通读,它将使人们更容易阅读您的代码,您也更容易阅读其他代码。您应该D也使用键绑定在<代码>键侦听器,见并不是<代码>矢量< /代码>赞成<代码>列表…@ FASTSNORY抱歉迟响应。您的代码实际工作!但是我们应该考虑MadProgrammer所说的,使用键绑定更方便,键码应该与常数变量进行比较。更具可读性和效率。但还有一件事,这可以实现到JTextField而不是JTextArea吗?@EriezeLagera JTextField只支持单行。如果你想要多行,那么textarea就可以了。但是你可以使用多个TextField来容纳多行。但是为什么呢?textarea很简单。@fastsnail是的,你是对的。我只需要c使用单行视图将我的JTextField更改为JTextArea以隐藏其他输入。谢谢!您可能想要通读,这将使人们更容易阅读您的代码和其他代码。您还应该在
keylister
上使用键绑定,请参阅Vector
不赞成使用列表<“代码StRoad对不起……迟响应。您的代码实际上是有效的。但是我们应该考虑MadProgrammer所说的,使用键绑定更方便,键代码应该与常量变量进行比较。它将更可读和高效。但是还有一件事,这可以实现到JTrdField,而不是JTeTaRea?”@ EriezeLagera jt。extField只支持单行。如果你想要多行,那么textarea就可以了。但是你可以使用多个textfields来容纳多行。但是为什么呢?textarea很简单。@fastsnail是的,你是对的。我只需将我的JTextField更改为具有单行视图的JTextArea来隐藏其他输入。谢谢!你可能想通读一下,它将使人们更容易阅读你的代码,并让你阅读别人。你也应该使用键绑定在<代码> Kist听者< /C> >,看到并不是<代码>矢量< /代码>赞成列表…@ FASTSNORY抱歉迟响应。你的代码实际上是有效的!但是我们应该考虑MadProgrammer所说的,用Key Bin丁格更方便,关键代码应该与常量变量相比较。它将更具可读性和效率。但还有一件事,这可以实现到JTextField而不是JTextArea吗?@EriezeLagera JTextField只支持单行。如果您想要多行,则textarea适用。但是,您可以使用多个TextField来实现保留多行。但是为什么?textarea很简单。@是的,你说得对。我只需将我的JTextField更改为带有单行视图的JTextArea,以隐藏其他输入。谢谢!你可能想要一个r