JEditorPane внутри JScrollPane не изменяет размеры по мере необходимости - PullRequest
5 голосов
/ 11 ноября 2008

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

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 25 октября 2011

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

JEditorPane pane = new JEditorPane() {
    public boolean getScrollableTracksViewportWidth() {
        return true;
    }
};
panel.add(new JScrollPane(pane));
4 голосов
/ 06 октября 2009

На самом деле это возможно, luiscubal. Вот как,

В 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
}

Смотри luiscubal это возможно. Не спешите объявлять о вещах на Java как невозможных. Качели api тихо гибки и могут сделать большую работу за вас. Однако, если вы используете JComponents способами, которые они не были предназначены для использования, у вас возникнут проблемы и будет два варианта.

  1. Подкласс Подкласс Подкласс в основном создает свой собственный компонент.
  2. найдите обходной путь, как описано выше.
0 голосов
/ 11 ноября 2008

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

...