JEditorPane внутри JScrollPane не изменяет размер по мере необходимости

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

автоматическая прокрутка jeditorpane

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

Я пробовал использовать setPreferrredSize, setSize, setMaximumSize для JEditorPane. Тем не менее размер панели редактора не уменьшается. Я пробовал вызвать в revalidate() или updateUI() после установки размера, но бесполезно.

Я использую Java 1.4.2.

Пожалуйста, поделитесь со мной своим мнением ....

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
8 905
3

Ответы 3

Невозможно уменьшить размер JEditorPane в JScrollPane, а затем уменьшить его. Вместо этого вы можете использовать JTextArea.

На самом деле это возможно, Луискубал. Вот как

В JScrollPane добавьте ComponentListener для событий изменения размера

public static void main(String...args) {
    //our test frame
    JFrame frame = new JFrame("JEditorPane inside JScrollPane resizing");
    frame.setLayout(new BorderLayout());

    //our editing pane
    final JEditorPane editor = new JEditorPane();

    //our simple scroll pane
    final JScrollPane scroller = new JScrollPane(editor);

    //NOTE: this is the magic that is kind of a workaround
            // you can also implement your own type of JScrollPane
            // using the JScrollBar and a JViewport which is the 
            // preferred method of doing something like this the 
            // other option is to create a JEditorPane subclass that
            // implements the Scrollable interface.
    scroller.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentResized(ComponentEvent e) {
            editor.setSize(new Dimension(
                               scroller.getWidth()-20, 
                               scroller.getHeight()-20));
        }
    });

    //just use up the entire frame area.
    frame.add(scroller, BorderLayout.CENTER);

    //quick and dirty close event handler
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(320, 240); //something not too big
    frame.setLocationRelativeTo(null); //centers window on screen
    frame.setVisible(true); // normally done in a SwingUtilities.invokeLater
}

Посмотрите, луискубал можно. Не спешите объявлять о том, что на Java невозможно. Swing api довольно гибкий и может сделать за вас большую часть работы. Однако, если вы используете JComponents так, как они не предназначены для использования, у вас возникнут проблемы и у вас будет два варианта.

  1. подкласс подкласс подкласса в основном создает свой собственный компонент.
  2. найти обходной путь, как и в приведенном выше решении.

JEditorPane уже реализует Scrollable. См. JEditorPane.

Raze 30.04.2011 01:41

как это могло получить Любые голосов? Совершенно неправильно ... (хотя, на удивление, работает ;-)

kleopatra 26.10.2011 11:07

Я понимаю, что на этот вопрос уже давно ответили, но для справки в будущем все, что вам нужно сделать, это переопределить getScrollableTracksViewportWidth(), чтобы всегда возвращать истину, например.

JEditorPane pane = new JEditorPane() {
    public boolean getScrollableTracksViewportWidth() {
        return true;
    }
};
panel.add(new JScrollPane(pane));

Это настолько чище, что пишущие слушатели! Большие пальцы вверх от меня.

Bat0u89 30.08.2012 03:50

Другие вопросы по теме