2014-12-20 3 views
0

Я работаю над очень простым приложением для отображения разума, и я использую JPanel для рисования структуры карты разума. Узлами карты разума являются круги, и если вы пишете в узле, структура расширяется в этом направлении. Я поместил свой JPanel в JScrollPane, но моя проблема в том, что я могу только расширить его вниз или вправо, но он должен расширяться и влево, и вверх. Когда моя JScrollPane должна расширяться в «отрицательных направлениях» вверх или влево, я попытался вычислить, сколько координат я сдвигаю, а не перерисовывать всю графику, изменяя координаты x и y всего, соответственно. Но он все еще не работал, он рисовал ту часть, которая видна правильно, но затем, когда я прокручивался вниз, остальная часть моего рисунка исчезла.Как развернуть jScrollPane во всех четырех направлениях?

Надеюсь, что для этого есть решение, потому что я искал часы и не нашел ничего полезного, и потому что я не могу придумать другого способа решить эту проблему. Спасибо за помощь! :)

ответ

1

Когда мой JScrollPane должен расширяться в «отрицательном направлениях», так вверх или влево

Вы не можете иметь отрицательные координаты, поэтому вам нужно перевести все индексы к положительным значениям.

, и если нет, я изменяю размер JPanel.

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

Затем вы вызываете:

revalidate(); 
repaint(); 

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

+0

Спасибо! Возможно, я не мог правильно объяснить свою проблему, но я действительно сделал, что вы написали! Моя ошибка заключалась в том, что я вычислил новые координаты в графическом классе, поэтому после того, как был вызван revalidate и repait. Я даже не знаю, почему ... это была такая глупость! :) Но простая копия и вставка решили проблему, поэтому спасибо за ваш ответ! :) –

+0

@ DobóAnna 'Я вычислил новые координаты в графическом классе, поэтому после revalidate и repait был вызван.' Это правильно. Вы должны вычислить координаты в графическом классе. Затем класс должен ссылаться на revalidate() и repaint() на себя. Ваш код приложения НЕ должен ссылаться на revalidate() и repaint(). – camickr

+0

О, я думал, я не должен ставить revalidate() и repaint() в графическом классе! Почему это неправильно, что мое приложение называет эти методы? Я довольно новичок в этой теме, так что извините, если это звучит как глупый вопрос, но то, что нажата кнопка, например, и это событие, я хочу перерисовать JPanel, чем перерисовка должна быть в actionlistener, не так ли? –

Смежные вопросы