Прослушивание в реальном времени высоты и ширины JFrame

У меня возникла ситуация, когда я хотел бы знать высоту и ширину JFrame, когда пользователь перетаскивает мышь, чтобы изменить размер кадра.

Я исследовал это, и ответы на следующий вопрос помогли мне немного, но не полностью: Прослушивать события изменения размера JFrame, когда пользователь перетаскивает мышь?

Моя проблема: я сделал свой класс «HSFrame» расширением JFrame и реализовал ActionListener, MouseMotionListener (однако ActionListener не имеет отношения к этому вопросу). Этот вопрос относится к MouseMotionListener.

У меня есть отдельный класс под названием «CanvasPanel», который расширяет JPanel — здесь я использую графический объект для обновления информации в реальном времени путем рисования строк.

public void mouseMoved(MouseEvent e)
{
}

public void mouseDragged(MouseEvent e)
{
    validate();
    canvas.repaint();
}

Это фрагмент кода из моего класса "HSFrame" (расширяет JFrame, реализует MouseMotionListener). В этом примере кода «холст» — это объект CanvasPanel, и я вызываю его метод repaint() всякий раз, когда вызывается MouseDragged.

Я решил использовать MouseMotionListener, потому что это (предположительно) будет давать мне обновления в реальном времени, в отличие от метода componentResized() ComponentListener (который привязан к MouseReleased).

Все обновляется на 100% идеально, когда я изменяю размер кадра из верхнего левого угла. Значения высоты, ширины, X и Y полностью перерисовываются.

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

В самом классе «CanvasPanel» я расширил ComponentListener и добавил туда прослушиватель для объекта «HSFrame» — он не обновляется в реальном времени, что было нормально, но перерисовывает высоту и ширину после отпускания мыши. , независимо от того, с каким углом был изменен размер HSFrame.

Основной вопрос: можно ли заставить MouseMostionListener знать, что я изменяю размер JFrame снизу справа? Он слышит, когда я перемещаю рамку, щелкая и перетаскивая строку заголовка, и слышит, когда я изменяю размер из верхнего левого угла (который также взаимодействует со строкой заголовка). Он просто не слышит, когда что-то переходит к другим границам JFrame.


person Waffle    schedule 28.12.2011    source источник
comment
Мммм, разве это не вызовет событие изменения свойства?   -  person Neil Coffey    schedule 28.12.2011
comment
Событие componentResized() срабатывает динамически для меня при изменении размера снизу/справа. Я использую JDK6_7 в XP. Опубликуйте свой SSCCE, демонстрирующий проблему.   -  person camickr    schedule 28.12.2011
comment
SSCCE Вот простейший пример, который я могу привести. Сохраните это как MainClass.java, скомпилируйте и запустите. Это должно работать как один файл JAVA. Проблема здесь заключается в следующем: изменение размера главного окна приложения не перерисовывается в режиме реального времени, когда пользователь перетаскивает его из правого нижнего угла. Он перерисовывается в режиме реального времени, перетаскивая из верхнего левого угла. Вот что меня заводит: если вы перетащите окно отладки из любого места, оно обновится в режиме реального времени. Так почему же главное окно этого не делает? Я добавил обоих слушателей в оба кадра. Справа внизу ЕДИНСТВЕННОЕ, что не работает.   -  person Waffle    schedule 28.12.2011
comment
Извините, вот небольшое исправление этого примера: SSCCE. Я забыл добавить canvas.repaint() в методы ComponentListener в классе ResizeFrame. Раньше я просто вызывал repaint().   -  person Waffle    schedule 28.12.2011
comment
Я предполагаю, что SSCCE состоит всего из 15-20 строк, поэтому код должен быть размещен на форуме, чтобы мы все могли его увидеть.   -  person camickr    schedule 28.12.2011
comment
Нет, это три класса. Сам код слушателя компонента занимает 15-20 строк.   -  person Waffle    schedule 28.12.2011
comment
Нет, SSCCE будет состоять из 15 строк кода. Цель SSCCE — упростить проблему. Докажите, что это работает с помощью простого кода, а затем внедрите решение в свою реальную программу.   -  person camickr    schedule 29.12.2011
comment
Что ж, извините, но невозможно привести пример этой проблемы до 20 строк кода. Если вы хотите помочь мне в дальнейшем, то самый простой пример, который я могу предоставить, находится по ссылке pastebin. Взгляните на источник, я прокомментировал все это.   -  person Waffle    schedule 30.12.2011


Ответы (1)


Вам не нужно делать это с помощью мыши! Сделайте это простым способом: напишите прослушиватель компонентов. Попросите HSFrame реализовать ComponentListener и поместите код изменения размера в public void componentResized(ComponentEvent e).

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

person eboix    schedule 28.12.2011
comment
Спасибо, но я действительно пробовал это. Вот SSCCE, показывающий, о чем я говорю (сохраните необработанный код как MainClass.java, скомпилируйте, затем запустите Это). ЕДИНСТВЕННАЯ вещь, которая НЕ обновляется в реальном времени, — это изменение размера ResizeFrame (эквивалентно HSFrame из примера) справа внизу. Я просто не понимаю - работает даже изменение размера рамки отладки из нижнего правого. Я добавил как ComponentListener, так и MouseMotionListener к обоим фреймам, но правый нижний угол ResizeFrame не перерисовывается при перетаскивании мыши. - person Waffle; 28.12.2011
comment
Извините, вот небольшое исправление этого примера: SSCCE. Я забыл добавить canvas.repaint() в методы ComponentListener в классе ResizeFrame. Раньше я просто вызывал repaint(). - person Waffle; 28.12.2011
comment
Я решил пока просто жить с этой проблемой, так как я только обновляю отладочную информацию, которая на самом деле не имеет ничего общего с реальной программой (высота/ширина для лучшего размещения компонентов и тому подобное). Но если кто-то все еще может понять, возможно ли сделать то, что я хотел изначально, это было бы здорово - person Waffle; 30.12.2011