Java:光标当前位置的列号和行号

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5139995/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 09:39:26  来源:igfitidea点击:

Java: column number and line number of cursor's current position

javaswingcursorcaretjtextarea

提问by Harry

I want to know the column number and row number where the cursor in JTextArea. ie. in notepad when i m at first line than status bar shows Ln 1, Col 1.

我想知道 JTextArea 中光标所在的列号和行号。IE。在记事本中,当我在第一行时状态栏显示 Ln 1, Col 1。

thanks in advance...

提前致谢...

回答by Jigar Joshi

Hereis the code

是代码

import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.event.*;

public class caretDemo extends JFrame {
    // Two controls, one is the editor and the other is our little status bar at the bottom.
    // When we update the editor, the change in caret will update the status text field.
    private JTextArea editor;
    private JTextField status;

    // Start of our caretDemo class
    public caretDemo() {
        setTitle("Caret Demo");
        setSize(500,500);

        // Lets create a border layout to make positioning of items easy and quick.
        setLayout(new BorderLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        editor = new JTextArea();

        // Add a caretListener to the editor. This is an anonymous class because it is inline and has no specific name.
        editor.addCaretListener(new CaretListener() {
            // Each time the caret is moved, it will trigger the listener and its method caretUpdate.
            // It will then pass the event to the update method including the source of the event (which is our textarea control)
            public void caretUpdate(CaretEvent e) {
                JTextArea editArea = (JTextArea)e.getSource();

                // Lets start with some default values for the line and column.
                int linenum = 1;
                int columnnum = 1;

                // We create a try catch to catch any exceptions. We will simply ignore such an error for our demonstration.
                try {
                    // First we find the position of the caret. This is the number of where the caret is in relation to the start of the JTextArea
                    // in the upper left corner. We use this position to find offset values (eg what line we are on for the given position as well as
                    // what position that line starts on.
                    int caretpos = editArea.getCaretPosition();
                    linenum = editArea.getLineOfOffset(caretpos);

                    // We subtract the offset of where our line starts from the overall caret position.
                    // So lets say that we are on line 5 and that line starts at caret position 100, if our caret position is currently 106
                    // we know that we must be on column 6 of line 5.
                    columnnum = caretpos - editArea.getLineStartOffset(linenum);

                    // We have to add one here because line numbers start at 0 for getLineOfOffset and we want it to start at 1 for display.
                    linenum += 1;
                }
                catch(Exception ex) { }

                // Once we know the position of the line and the column, pass it to a helper function for updating the status bar.
                updateStatus(linenum, columnnum);
            }
        });

        // Add the fields to the layout, the editor in the middle and the status at the bottom.
        add(editor, BorderLayout.CENTER);

        status = new JTextField();
        add(status, BorderLayout.SOUTH);

        // Give the status update value
        updateStatus(1,1);
    }

    // This helper function updates the status bar with the line number and column number.
    private void updateStatus(int linenumber, int columnnumber) {
        status.setText("Line: " + linenumber + " Column: " + columnnumber);
    }

    // Entry point to the program. It kicks off by creating an instance of our class and making it visible.
    public static void main(String args[]) {
        caretDemo caretDemoApp = new caretDemo();
        caretDemoApp.setVisible(true);
    }
}


Output

输出

enter image description here

在此处输入图片说明

回答by dogbane

You need to use Utilities.getRowStartalong with the caret position as shown below:

您需要Utilities.getRowStart与插入符号位置一起使用,如下所示:

To get the row number:

获取行号:

int caretPos = textArea.getCaretPosition();
int rowNum = (caretPos == 0) ? 1 : 0;
for (int offset = caretPos; offset > 0;) {
    offset = Utilities.getRowStart(textArea, offset) - 1;
    rowNum++;
}
System.out.println("Row: " + rowNum);    

To get the column number:

要获取列号:

int offset = Utilities.getRowStart(textArea, caretPos);
int colNum = caretPos - offset + 1;
System.out.println("Col: " + colNum);

回答by kokosing

Have you tried getCaretPosition?

你试过getCaretPosition吗?

You have to count \nto know which line you have, and you have to count the difference between current caret position and last occurrence of \ncharacter.

你必须数数\n才能知道你有哪一行,你必须计算当前插入符号位置和最后一次出现的\n字符之间的差异。