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

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

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

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 на большое значение, он должен изменить размер, и полосы прокрутки должны появиться правильно? Ну, он остается на том же уровне 600 пикселей, как я установил в начале.

2 ответа

Решение

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

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

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

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

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

Также вы можете позвонить

paintCanvas.revalidate()

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

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