Java Swing JTextArea Номер строки - PullRequest
0 голосов
/ 05 сентября 2018

Это количество строк в текстовой области. Код работает правильно, но при запуске этого кода текстовая область не активна, каретка скрыта и клавиатура
ключи не работают, пока я не нажму на textarea.

код:

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Element;

public class LineNumber extends JFrame implements DocumentListener {

    private static final long serialVersionUID = -1093726028044203117L;

    private JScrollPane scroll;
    private JTextArea textArea, lineArea;

    public static void main(String[] args) {

        new LineNumber().setVisible(true);

    }

    public LineNumber() {

        super("Line Numbers");

        setSize(500, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setUI();
    }

    private void setUI() {

        textArea = new JTextArea();

        lineArea = new JTextArea(0, 3);
        lineArea.setEditable(false);
        lineArea.setForeground(Color.GRAY);

        scroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        textArea.getDocument().addDocumentListener(this);

        scroll.setViewportView(textArea);
        scroll.setRowHeaderView(lineArea);
        getContentPane().add(scroll, BorderLayout.CENTER);

    }

    public void changedUpdate(DocumentEvent event) {

        lineArea.setFont(textArea.getFont());
        lineArea.setText(getLine());

    }

    public void insertUpdate(DocumentEvent event) {

        lineArea.setFont(textArea.getFont());
        lineArea.setText(getLine());
    }

    public void removeUpdate(DocumentEvent event) {

        lineArea.setFont(textArea.getFont());
        lineArea.setText(getLine());
    }

    public String getLine() {

        int caretPos = 0;
        String lines;

        caretPos = textArea.getDocument().getLength();
        Element root = textArea.getDocument().getDefaultRootElement();
        lines = String.format("%s%s", 1, System.lineSeparator());

        for (int i = 2; i < root.getElementIndex(caretPos) + 2; i++) {
            lines += String.format("%s%s", i, System.lineSeparator());

        }

        return lines;

    }

}

Если я не добавляю lineArea в область прокрутки, текстовая область работает правильно, но после добавления в setRowHeaderView текстовая область становится активной только щелчком мыши ....

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы можете предотвратить фокусировку текстовой области номера строки, используя:

lineArea = new JTextArea(0, 3);
lineArea.setEditable(false);
lineArea.setFocusable(false);

Вы также можете проверить Номер строки текстового компонента для более изящной реализации, которая поддерживает:

  1. завернутый текст
  2. текст со шрифтами разного размера (при использовании JTextPane)
0 голосов
/ 05 сентября 2018

По умолчанию он фокусируется на первом компоненте, поэтому, если вы хотите сосредоточиться на другом, попробуйте этот код в конструкторе.

addWindowFocusListener(new WindowAdapter() {
    @Override
    public void windowGainedFocus(WindowEvent e) {
        textArea.requestFocusInWindow();
    }
});

textArea теперь сфокусировано, подробнее об этом .

...