当前位置: 首页 > 知识库问答 >
问题:

JTextArea中的命令行指示器

高溪叠
2023-03-14

所以我做了这个TextArea,在这里我输入不同的命令,并用换行符“\n”将它们分开,如果其中一行有错误,我就把它写在控制台输出中。在这里,我做了一个非常简单的,也不是最好的解决方案,使这行指示,但它有点bug。

我是怎么做的

我定义了一个textarea,在这里我可以键入不同的信息/命令,如果其中一个命令/行无效,我就把它写在控制台中,只是为了暂时显示一些内容。我基本上通过将textarea行拆分为“\n”来计算行数,然后计算错误发生在哪一行中,左边的consolelinenum使用textarea中的行数,然后生成一个包含所有行数+“\n”的字符串。但这里我的问题是,这是一个足够好的方法吗,如果是,为什么/如何使它更健壮,否则我如何使这个指示,在左边的行号?当用户在textarea中创建一个新行时,它必须增加。

java prettyprint-override">private static void createAndShowGUI() {    

    //Create and set up the window.
    JFrame frame = new JFrame("GUI");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(width, height);
    frame.setLayout(new BorderLayout(3,3));

    /*----- Panels -----*/
    JPanel panel1       = new JPanel();
    JPanel panel2       = new JPanel();
    JPanel panel3       = new JPanel();

    //Add Components to this panel.
    JScrollPane scrollPane = new JScrollPane(textArea);
    JScrollPane scrollPaneOutput = new JScrollPane(consoleOutput);
    textArea.setCaretPosition(textArea.getDocument().getLength());
    consoleOutput.setEditable(false);
    consoleLineNum.setEditable(false);
    ButtonPanel_listener(buttonPanel);

    textArea.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {

        }

        @Override
        public void keyPressed(KeyEvent e) {
                consoleLineNum.setText("");
                StringBuilder sb = new StringBuilder();
                for (int i = 1; i <= Integer.parseInt(String.valueOf(textArea.getText().split("\n").length)); i++) {
                    sb.append(i + " \n");
                }
                consoleLineNum.setText(sb.toString());
        }

        @Override
        public void keyReleased(KeyEvent e) {

        }
    });

    //Background
    panel1.setBackground(Color.LIGHT_GRAY);

    //Preferred size
    panel1.setPreferredSize(new Dimension(100, 100));
    scrollPane.setPreferredSize(new Dimension(200, 200));

    panel2.setLayout(new BorderLayout());
    panel2.add(scrollPane, BorderLayout.CENTER);
    panel2.add(buttonPanel, BorderLayout.SOUTH);
    panel2.add(consoleLineNum, BorderLayout.WEST);
    consoleLineNum.setText(num);

    panel3.setLayout(new BorderLayout());
    panel3.add(drawCanvas, BorderLayout.CENTER);

    panel1.setLayout(new BorderLayout());
    panel1.add(scrollPaneOutput, BorderLayout.CENTER);

    //textArea.addActionListener(e -> drawCanvas.drawCircle(250, 250, 200));

    //Add contents to the window.
    frame.add(panel2, BorderLayout.WEST);
    frame.add(panel3, BorderLayout.CENTER);
    frame.add(panel1, BorderLayout.SOUTH);

    //Display the window.
    frame.pack();
    frame.setVisible(true);

}

预期结果与实际结果之间的差异

当我点击换行/回车键时,它不会立即显示数字,只有在我开始键入时才显示。

在这里,我希望它与用户所在的位置匹配,所以如果用户点击enter并转到下一行,那么数字匹配并立即显示。

如果我删除所有的行,除了一些,它仍然显示数字

在这里,我想让它鞭打所有的数字,并更新它以匹配textarea中的数据量

共有2个答案

相洛华
2023-03-14

我有一年没有在Java写作了很抱歉,如果我搞错了语法

首先,为什么您不会通过按Enter来实现行换行和行计数增量?在我看来要简单得多

@Override
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_ENTER) {
        textArea.append("\n"); 
        Integer lineCount = Integer.parseInt(consoleLineNum.getText());
        Integer newLineNumber = new Integer(lineCount.intValue() + 1)
        consoleLineNum.append("\n" + newLineNumber.toString())
    }
}

然而,您仍然不会得到实际的行数,如果其中一些将被删除。因此您还可以向keypressed()方法添加更复杂的逻辑

if(e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
    // Well I actually googled this line for counting occurences
    Integer linesCountActual = textArea.getText().split("\n", -1).length - 1);
    Integer linesCountLeft = consoleLineNum.getText().split("\n", -1).length - 1);
    if (linesCountActual > linesCountLeft) {
        String oldText = consoleLineNum.getText();
        String newText = oldText.substring(0, oldText.length() - 2);
        consoleLineNum.setText(newText);
    }
}
郦兴德
2023-03-14

试着这样做:

 yourTextArea.addKeyListener(new KeyAdapter() {
    @Override
    public void keyTyped(KeyEvent e) {

        // Returns true every time the user presses either backspace or enter.
        if (e.getKeyChar() == '\n' || e.getKeyChar() == '\b') {

            int lines;
            
            // Checks if the text ends with a newline, if so,
            // it adds 1 to the line count, so that would make your line
            // appear even if the user just started a new line.
            if (yourTextArea.getText().endsWith("\n")) {
                lines = yourTextArea.getText().split("\n").length + 1;
            } else {
                lines = yourTextArea.getText().split("\n").length;
            }

            // Removes previous count.
            linePanel.setText("");

            // Appends a new line to the area for every line.
            for (int i = 0; i < lines; i++) {
                linePanel.append((i + 1) + "\n");
            }

        }
    }
});
 类似资料:
  • 本文向大家介绍PHP的命令行命令使用指南,包括了PHP的命令行命令使用指南的使用技巧和注意事项,需要的朋友参考一下  当用户打开php页面时,服务端便执行PHP的命令并将执行结果发送至用户的浏览器中,这类似于ASP和CoildFusion,PHP可以运行在WINDOWS和多种版本的UNIX上。除了能够操作您的页面外,PHP还能发送HTTP的标题。 你可以设置cookie,管理数字签名和重定向用户,

  • 标准 go 语言项目文件目录格式 项目文件夹就是 GOPATH 指向的文件夹 src 文件夹是专门用于存放源码文件的 main 文件夹是专门用于存储 package main 包相关源码文件的 其它文件夹是专门用于存储除 package main 包以外源码文件的 bin 文件夹是专门用于存储编译之后的可执行程序的 pag 文件夹是专门用于存储编译之后的 .a 文件的 |---项目文件夹 ----

  • 问题内容: 有没有一种可靠的方法来计算字符串如何在JTextArea中划分为行? 我有一个固定宽度的JTextArea,当它被填充时,会添加一个新行并垂直扩展。 现在,我需要确切地知道哪一行中的字符。我可以使用字体指标来计算单个字符的宽度,但是我不知道这是否可靠,或者是否有更好的方法。 字体指标是“绝招”吗? 问题答案: 所有JTextComponent都具有和可以提供帮助的方法,但也许更好的是j

  • 有没有可靠的方法来计算一个字符串在JTextArea中是如何划分成行的? 我有一个固定宽度的JTextArea,当它被填充时,就会添加一个新行,并且它会垂直扩展。 现在,我需要确切地知道哪些字符在哪一行。我可以使用字体度量来增加单个字符的宽度,但我不知道这是否可靠,或者是否有更好的方法。 字体度量“诡计”是唯一的方法吗?

  • 好吧,我是新来的Java,并试图从命令提示符运行一个java程序(因为Sublime编译和运行它的小东西,但不允许用户输入和东西)。 我将命令提示符设置为我有我的文件的文件夹,称为Learner.java. 我在环境变量中为JDK bin设置了一个路径,并创建了一个JAVA_HOME变量,其中包含JDK bin的值(其他一些帖子建议)。 在我讨论这个问题之前,这是我的代码: 如你所见,这是一个以“

  • 本文向大家介绍通过什么命令指定命令提示符?相关面试题,主要包含被问及通过什么命令指定命令提示符?时的应答技巧和注意事项,需要的朋友参考一下 答案: \u:显示当前用户账号 \h:显示当前主机名 \W:只显示当前路径最后一个目录 \w:显示当前绝对路径(当前用户目录会以~代替) $PWD:显示当前全路径 $:显示命令行’$'或者’#'符号 #:下达的第几个命令 \d:代表日期,格式为 week da