Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTextField:记录输入历史,如来自终端_Java_Swing - Fatal编程技术网

Java JTextField:记录输入历史,如来自终端

Java JTextField:记录输入历史,如来自终端,java,swing,Java,Swing,我想开发一个Swing应用程序,其中可能包含文本字段,其作用类似于终端(Unix/Linux系统的控制台) 每当用户输入命令时,它将保存到容器中,然后通过向上或向下箭头访问(↑/ ↓). 我知道这是可能的,但我仍然没有正确实现它的想法。我的第一个实现是将命令存储到单个文本文件中,然后以相反的顺序访问它,以便首先检索最后的输入 我的问题是如何知道我是否在指定的索引中(例如2↑ 箭头将进入文件的长度2索引)。这是一个非常基本的示例,但工作正常。按enter键时,您可以获取用户输入,并将其添加到arr

我想开发一个Swing应用程序,其中可能包含文本字段,其作用类似于终端(Unix/Linux系统的控制台)

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

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


我的问题是如何知道我是否在指定的索引中(例如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