автопрокрутка JEditorPane

Я использую JEditorPane в качестве редактора для написания комментариев в своем приложении. Тип контента установлен "текстовый/обычный". Когда я пишу в нем текст, и текст заполняет доступное пространство, и я продолжаю печатать, текст не перемещается вверх, чтобы показать курсор. Поэтому я не знаю, где я печатаю и что я печатаю, так как это будет видно.

Не могли бы вы рассказать мне, как всегда показывать курсор, перемещая текст выше?

Вместо этого было бы лучше, если бы я мог автоматически изменять размер редактора во время набора текста. JEditorPane находится внутри JPanel, поэтому мне тоже нужно изменить его размер. Любые идеи?


person sv_in    schedule 07.11.2008    source источник
comment
нет, я не могу использовать область прокрутки. по крайней мере, я не могу показать полосы прокрутки... :(   -  person sv_in    schedule 08.11.2008


Ответы (2)


Вам нужно поместить редактор в JScrollPane. ScrollPane автоматически добавит полосы прокрутки и избавит от необходимости изменять размер редактора.

person Vincent Ramdhanie    schedule 07.11.2008
comment
нет, я не могу использовать область прокрутки. по крайней мере, я не могу показать полосы прокрутки... :( - person sv_in; 08.11.2008

Отредактировано, чтобы добавить полное решение

Сначала вы должны добавить JScrollPane. Затем, если вы не хотите, чтобы полосы прокрутки были видны, но вы хотите, чтобы текстовая область прокручивалась автоматически, установите

scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);

на панели прокрутки. Это скроет полосы прокрутки, но предоставит вам автопрокрутку.

Вот как вы могли бы реализовать автоматическую прокрутку с помощью панели прокрутки и автоматическое изменение размера до заданного максимума.

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;


public class SPTest extends JFrame {

    private static final long serialVersionUID = 1L;

    private JEditorPane editor;
    private JScrollPane scrollPane;
    private JPanel topPanel;
    private JLabel labelTop;

    public SPTest() {
        super("Editor test");
        initComponents();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void initComponents() {
        editor = new JEditorPane("text/plain", null);
        scrollPane = new JScrollPane(editor);
        topPanel = new JPanel();
        labelTop = new JLabel("main contents here");
        topPanel.add(labelTop);

        setSize(600, 400);
        editor.setMinimumSize(new Dimension(100, 30));
        editor.setPreferredSize(new Dimension(100, 60));
        scrollPane.setPreferredSize(new Dimension(600, 60));
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
        scrollPane.setMinimumSize(new Dimension(100, 30));

        final int MAX_HEIGHT_RSZ = 120;
        editor.addCaretListener(new CaretListener() {

            public void caretUpdate(CaretEvent e) {
                int height = Math.min(editor.getPreferredSize().height, MAX_HEIGHT_RSZ);
                Dimension preferredSize = scrollPane.getPreferredSize();
                preferredSize.height = height;
                scrollPane.setPreferredSize(preferredSize);
                SPTest.this.validate();
            }
        });

        setLayout(new BorderLayout());
        add(topPanel, BorderLayout.NORTH);
        add(scrollPane, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        new SPTest();
    }

}

Вы можете изменить размер. Вы можете использовать эту JScrollPane вместо JPanel в качестве контейнера для редактора.

person Raze    schedule 29.04.2011
comment
Как насчет того, чтобы просто делать myJEditorPane.setCaretPosition(myJEditorPane.getDocument().getLength()); каждый раз, когда текст обновляется? - person André Willik Valenti; 25.09.2015