Проблема с номером строки JTextArea и изменением размера текстов JTextArea - PullRequest
0 голосов
/ 11 сентября 2018

этот код считает каждую строку JTextArea и добавляет номер строки в
слева JTextPane

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

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.MatteBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Element;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class LineNumber extends JFrame implements DocumentListener {

    private static final long serialVersionUID = -1093726028044203117L;

    private JScrollPane scroll;
    private JTextArea textArea;
    private TextPane 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();
        textArea.getDocument().addDocumentListener(this);

        lineArea = new TextPane(0, 3);
        lineArea.setText(getLine());

        lineArea.setEditable(false);
        lineArea.setFocusable(false);
        lineArea.setBorder(new MatteBorder(0, 0, 0, 1, new Color(248, 248, 248)));
        lineArea.setBackground(new Color(255, 255, 255));
        lineArea.setForeground(Color.GRAY);

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

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

    }

    public void changedUpdate(DocumentEvent event) {

            lineArea.setText(getLine());

    }

    public void insertUpdate(DocumentEvent event) {

        lineArea.setText(getLine());
    }

    public void removeUpdate(DocumentEvent event) {


        lineArea.setText(getLine());

    }

    private String getLine() {

        int caretPos = 0;
        String lines = "";

        caretPos = textArea.getDocument().getLength();
        Element root = textArea.getDocument().getDefaultRootElement();

        for (int i = 1; i < root.getElementIndex(caretPos) + 2; i++)
            lines += String.format("%s  \n", i);

        return lines;

    }

    private int getLength() {

        int caretPos = 0;
        int length = 0;

        caretPos = textArea.getDocument().getLength();
        Element root = textArea.getDocument().getDefaultRootElement();

        int max = 0;
        for (int i = 1; i < root.getElementIndex(caretPos) + 2; i++)
            length = String.valueOf(Math.max(i, max)).length();

        return length;

    }


    private void setRightAlign() {

        StyledDocument doc = lineArea.getStyledDocument();
        SimpleAttributeSet right = new SimpleAttributeSet();

        StyleConstants.setAlignment(right, StyleConstants.ALIGN_RIGHT);
        doc.setParagraphAttributes(0, doc.getLength(), right, false);

    }

}

, если lineArea и textArea используют один и тот же шрифт с одинаковым размером
программа работает хорошо, но если изменить илиизменить размер шрифта textArea
, он не работает с различными размерами шрифта
и заканчивался слишком коротким, чем фактическая конечная строка

code work good and care balance with line number

после изменения размера шрифта textarea или размера шрифта:

enter image description here

после изменения размера области строки и несбалансированности textarea
Я не хочу изменять размер шрифта textarea
только текстовое поле баланса с номерами строк

1 Ответ

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

Я не знаю, что такое класс TextPane, потому что это не стандартный компонент JDK.

Если это JTextArea, то, возможно, вы можете переопределить метод getRowHeight(..), чтобы получить высоту, основанную на шрифте основного JTextArea.

Если это JTextPane, то, возможно, вы можете использовать StyleConstants.setSpaceBelow(...) для добавления дополнительного пробела после каждой строки. Таким образом, вам необходимо получить метрики шрифтов обоих шрифтов, которые используются для вычисления высоты каждого шрифта. Тогда разница будет примерно в том, что вы используете для нижеприведенного метода.

Другой вариант - использовать класс, который я указал в вашем последнем вопросе. Он уже поддерживает эту функцию.

...