Как изменить размер JPanel внутри JScrollPane? - PullRequest
1 голос
/ 17 ноября 2010

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

Ответы [ 2 ]

7 голосов
/ 17 ноября 2010

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

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

3 голосов
/ 31 декабря 2010

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

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

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

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

paintCanvas.revalidate()

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

...