Я использую библиотеку Swing bits для добавления фильтров в заголовки столбцов jtable. Библиотека работает так, как ожидалось, но jpopupmenu, который появляется в правом щелчке столбца, не изменяет размер. (изменение размера разрешено только в нижнем правом углу с помощью мыши). Снимок экрана, показанный ниже.Изменение размера jpopupmenu с помощью мыши-адаптера
Я раздобыл распашные биты исходного кода библиотеки, чтобы попытаться выяснить этот вопрос, это то, что я нашел.
Изменение размера jpopupmenu осуществляется с помощью MouseMotionListner и MouseListener. В основном метод MouseDragged вызывается непрерывно, что должно обновлять размер jpopupmenu до тех пор, пока мышь не будет выпущена. Код показан ниже.
public void mouseDragged(MouseEvent e) {
//System.out.println("test_0");
if (!isResizing){
//System.out.println("test_3");
return;}
Point p = toScreen(e);
int dx = p.x - mouseStart.x;
int dy = p.y - mouseStart.y;
Dimension minDim = menu.getMinimumSize();
Dimension newDim = new Dimension(startSize.width + dx, startSize.height + dy);
if (newDim.width >= minDim.width && newDim.height >= minDim.height) {
menu.setPopupSize(newDim);
//System.out.println("test_1");
}
//System.out.println("test_2");
}
Через некоторое время отладки, я понял, проблема заключается в вызове метода menu.setPopUpSize (newDim).
Без этого бита кода метод mouseDragged() вызывается постоянно, когда я пытаюсь изменить размер jpopupmenu. (как и следовало ожидать). Выяснилось это с помощью процитированных заявлений печати.
С включенным меню menu.setPopUpSize (newDim) метод mouseDragged() вызывается только один раз. По какой-то причине событие перетаскивания мыши не регистрируется снова после вызова метода setPopUpSize. Обратите внимание, что метод НЕ возвращает. При этом единственном вызове setPopUpSize() слегка изменяет размер popupmenu с обновленным значением newDim. В идеале метод mouseDragged() должен вызываться несколько раз, пока пользователь не отпустит действие перетаскивания мышью, непрерывно изменяя popupmenu.
Одна работа вокруг я решил публично объявить значение newDim и вызвать метод setPopUpSize (newDim) внутри метода mouseReleased(). Это получает окончательные координаты от перетаскивания мышью и использует это для изменения размера всплывающего меню. Но это не показывает перетаскивание ребер для пользователя, что очень неудобно.
Любая помощь будет высоко оценена.
Исполнение без метода setPopUpSize (newDim):
test_0
test_1
test_2
test_0
test_1
test_2 ...
этот шаблон повторяется до перетаскивания мыши отпущена.
Исполнение с методом setPopUpSize (newDim):
test_0
test_1
test_2
Метод mouseDragged() вызывается только один раз.
'setPopupSize', который представляет собой метод' JPopupMenu' устанавливает 'preferredSize' компоненту, при изменении размера, оно переходит скрыть и reshow всплывающего окна – MadProgrammer
Не могли бы вы подробнее остановиться на«это продолжается скрыть и отобразить всплывающее окно? – fsociety
Вызов 'setPopupSize', вызывает' showPopup', это закрывает текущее всплывающее окно (если оно видимо) и воссоздает окно, основанное на новом 'preferredSize' всплывающего окна. Как фактически создается окно, зависит от ряда системных критериев. Это может означать, что при этом «MouseListener', которые были ранее зарегистрированы », могут« зарегистироваться »при догадке – MadProgrammer