Как я могу сделать так, чтобы JPanel обновлял себя после прокрутки окна? - PullRequest
2 голосов
/ 24 февраля 2009

Я новичок в Java, так что это, вероятно, довольно просто, но я не уверен, как заставить его работать.

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

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

edit: также, когда я открываю одно из меню, и оно перекрывается на чертеже, область, которая была покрыта меню, не обновляется.

Хорошо, давайте попробуем еще раз: У меня есть класс под названием ничья. Тогда у меня есть GridBagLayout из розыгрышей. Это создает сетку мне нужно. У меня есть объект, перемещающийся по сетке, поэтому я могу обновить сетку, не вычисляя прямоугольники, которые должны быть обновлены.

Тогда эта сетка находится внутри JScrollPane, которая не является подклассом. Я использую pack (), когда создаю свое окно, но дело в том, что окно может быть больше, чем позволяет разрешение, поэтому мне нужно, чтобы его можно было прокручивать. У меня есть свиток, но он не обновляет изображение, когда я его использую. Однако изменение размера окна обновляет его.

То, что я хочу, - это способ перерисовать все мое окно, когда я нажимаю JScrollPane. И теперь мне также нужно перерисовать все это (или некоторые части, я увижу это позже), как только я получу доступ к меню, потому что рисованные части сетки под меню не обновляются.

Это лучший способ, которым я могу это описать.

Ответы [ 6 ]

1 голос
/ 25 февраля 2009

Похоже, вы хотите сделать что-то вроде этого:

    final JScrollPane pane = new JScrollPane();
    pane.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            pane.revalidate();
        }
    });

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

1 голос
/ 24 февраля 2009

Просто добавьте прослушиватель для прокрутки событий изменения области просмотра и выполните repaint (). Я думаю, что я бы посоветовал против ответа Стива Мойера, так как рисование должно быть сделано только как часть рисования.

И если прокручиваемый компонент достаточно велик, вам просто нужно перекрасить ту часть вашего JPanel, которая видна внутри компонента области просмотра (вашего JScrollPane).


Редактировать

Чтобы отслеживать перемещение области просмотра, используйте JScrollPane getViewport () и JViewport addChangeListener (). Затем используйте методы JViewport, чтобы определить, какая часть вида видна при определении области для рисования в методе рисования. Обратите внимание, что эта оптимизация должна применяться только после правильной работы рисования путем перерисовки всего вида в каждом событии рисования.

0 голосов
/ 25 февраля 2009

убедитесь, что панель, на которой хранится все, установлена ​​как видовое окно вашей панели прокрутки (JScrollPane.setViewportView)

0 голосов
/ 24 февраля 2009

Вы случайно не рисуете свой "draw" вне методов paint () или paintComponent ()? Если это так, вам нужно переместить код рисования в paintComponent ().

0 голосов
/ 24 февраля 2009

Прошло много времени с тех пор, как я создал какую-либо графику в Swing, но я думаю, что код, который вы ищете, выглядит примерно так:

Graphics g = getGraphics();
if (g != null) paintComponent(g);
else repaint();

И, как вы заметили, вам нужно добавить этот код в слушатель, присоединенный к функциям прокрутки JPanel.

Я бы, вероятно, создал Canvas, который содержал бы весь рисунок, и поместил бы его в JScrollPane. Это позволит Java делать всю работу!

0 голосов
/ 24 февраля 2009

Возможно, вам нужно указать минимальный размер.

Вы не публикуете код или снимок экрана, поэтому его сложно просмотреть.

Попробуйте прочитать комментарии в этой теме, похоже,

JScrollPane теперь показывает свое окно просмотра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...