Как изменить размер JPanel внутри JScrollPane?

Я просто не могу понять это правильно. У меня есть ползунок для увеличения размера JPanel (используется в качестве холста для рисования).

Всякий раз, когда JPanel получает событие, я изменяю его размер с помощью setBounds(), и я вижу, как он изменяется на долю секунды, но следующая Paint или что-то еще возвращает его к исходному размеру, заданному свойством предпочтительного размера ползунка.

public class ShapesMainFrame extends JFrame {
    private PaintCanvas paintCanvas;
    public ShapesMainFrame() {
        [...]
        JScrollPane scrollPane = new JScrollPane(paintCanvas);
        scrollPane.setPreferredSize(new Dimension(1,600));
        add(scrollPane, BorderLayout.CENTER);
        pack();
    }
}

public class PaintCanvas extends JPanel {
    [...]
    public void setScale(int value) {
        setSize(1000,1000);
    }
}

Итак, когда я пытаюсь изменить размер JPanel на большое значение, он должен изменить размер, и полосы прокрутки должны появиться правильно? Ну, высота остается той же 600px, как я установил в начале.


person sekmet64    schedule 16.11.2010    source источник


Ответы (2)


Никогда не используйте setSize() или setBounds при использовании менеджера компоновки. Важен «предпочтительный размер». Обычно предпочтительный размер компонента автоматически определяется менеджером компоновки. Но если вы рисуете на панели по индивидуальному заказу, вам может потребоваться вручную определить предпочтительный размер.

Полосы прокрутки появятся, когда предпочтительный размер панели больше, чем размер области прокрутки. Переопределите метод getPreferredSize() (предпочтительное решение) или используйте метод setPreferredSize() пользовательской панели.

person camickr    schedule 17.11.2010
comment
Спасибо! Я тоже пробовал setPreferredSize(), но это не сработало, поэтому я попробовал setSize. Но перезапись getPreferredSize() сработала отлично! :) - person sekmet64; 17.11.2010

Все, что вам нужно сделать, это вызвать revalidate() для содержимого в JScolPane после обновления его размера. Кроме того, используйте setPreferredSize() при использовании менеджера компоновки.

public void setScale(int value) {
     setPreferredSize(new Dimension(1000, 1000);   
     revalidate();
}

Это заставит JScrollPane обновить свои полосы прокрутки.

Кроме того, вы можете позвонить

paintCanvas.revalidate()

Если вы хотите обновить JScrollPane вне вашего класса paintCanvas

person pR0Ps    schedule 31.12.2010