автоматическая прокрутка JEditorPane - PullRequest
0 голосов
/ 07 ноября 2008

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

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

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

Ответы [ 2 ]

4 голосов
/ 07 ноября 2008

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

1 голос
/ 30 апреля 2011

Отредактировано для добавления полного решения

Сначала вы должны добавить 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 в качестве контейнера для редактора.

...