Изменение размера JPanel внутри JScrollPane очищает то, что я нарисовал на JPanel - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть JPanel внутри JScrollPane. Я рисую вещи в JPanel, и в какой-то момент я могу рисовать за шириной JScrollPane. В этом случае мне бы хотелось, чтобы появилась горизонтальная полоса прокрутки, и я хотел бы иметь возможность прокручивать, чтобы просмотреть различные части JPanel. Однако в итоге я очищаю JScrollPane.

frame = new JFrame();
frame.setBounds(100, 100, 1000, 800);
localScrollPane = new JScrollPane();
localScrollPane.setBounds(768, 6, 226, 350);
frame.getContentPane().add(localScrollPane);        
localView = new JPanel();
localScrollPane.setViewportView(localView);

drawSomeThings(localView.getGraphics());
// wait for user input
int newWidth = drawThingsPastTheWidth(localView.getGraphics());

// these next two lines clear it
localView.setPreferredSize(new Dimension(newWidth, localView.getHeight()));
localView.revalidate();

Что я делаю не так? Спасибо!

Ответы [ 4 ]

4 голосов
/ 09 ноября 2011
drawSomeThings(localView.getGraphics());

Не используйте метод getGraphics () для рисования.Рисование будет потеряно в следующий раз, когда Swing определит, что компоненты должны быть перекрашены.

Вместо этого пользовательское рисование выполняется путем переопределения paintComponent() метода вашего компонента.

2 голосов
/ 09 ноября 2011
  1. Не используйте метод setPreferredSize, вот связанный поток .
  2. Не указывайте явно размер JScrollPane с помощью setBounds. Пусть LayoutManager его родителя позаботится об этом.
  3. JScrollPane должен использовать ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED по умолчанию. Так полоса прокрутки должна появиться автоматически, когда предпочтительный размер дочерний компонент выше отображаемой области. Пробовать повторно проверьте JScrollPane вместо JPanel.
0 голосов
/ 09 ноября 2011

вы должны обязательно использовать перерисовку вместо повторной проверки. revalidate только помечает весь контейнер до верхнего уровня как недействительный.

0 голосов
/ 09 ноября 2011

Может показаться, что перерисовка вызывается в какой-то момент, я некоторое время не использовал Swing, поэтому я не совсем уверен, в чем проблема, но попробуйте отладку и прогон кода, шаг за шагом, чтобы увидеть, где перерисоватьбудет хорошим стартовым местом.

...