2015-12-27 6 views
1

Я использую библиотеку Swing bits для добавления фильтров в заголовки столбцов jtable. Библиотека работает так, как ожидалось, но jpopupmenu, который появляется в правом щелчке столбца, не изменяет размер. (изменение размера разрешено только в нижнем правом углу с помощью мыши). Снимок экрана, показанный ниже.Изменение размера jpopupmenu с помощью мыши-адаптера

Swing Bits column filter 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() вызывается только один раз.

+0

'setPopupSize', который представляет собой метод' JPopupMenu' устанавливает 'preferredSize' компоненту, при изменении размера, оно переходит скрыть и reshow всплывающего окна – MadProgrammer

+0

Не могли бы вы подробнее остановиться на«это продолжается скрыть и отобразить всплывающее окно? – fsociety

+1

Вызов 'setPopupSize', вызывает' showPopup', это закрывает текущее всплывающее окно (если оно видимо) и воссоздает окно, основанное на новом 'preferredSize' всплывающего окна. Как фактически создается окно, зависит от ряда системных критериев. Это может означать, что при этом «MouseListener', которые были ранее зарегистрированы », могут« зарегистироваться »при догадке – MadProgrammer

ответ

0

Что ж! Оказывается, проблема была в версии java. Я запускал java 1.8.0_25 (x64), обновлял его до последней версии (1.8.0_66), и проблема исчезла. Библиотека отлично работает. Более подробную информацию об этой проблеме можно найти здесь.

https://github.com/eugener/oxbow/issues/44

1

Это может происходить в зависимости от раскладки JPopupMenu использует, есть способ, чтобы установить размер родительского окна и проверки его так макет повторно вычисляется снова следующим образом:

public class ResizePopup { 

    private final static JPopupMenu menu = new JPopupMenu(); 

    public static void main(final String[] args) { 

     final JButton small = new JButton("Small"); 
     small.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       resize(100, 100); 
      } 
     }); 

     final JButton big = new JButton("Big"); 
     big.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       resize(400, 400); 
      } 
     }); 

     menu.add(small); 
     menu.add(big); 
     menu.show(null, 50, 50); 
    } 

    private static void resize(final int width, final int height) { 
     final Window window = (Window) menu.getTopLevelAncestor(); 
     window.pack(); 
     window.setSize(width, height); 
     window.validate(); 
    } 
} 
+0

да. Я проверил эти значения, новые измерения попадают в пределы. Добавлен menu.repaint() не работает. Проблема в том, что есть только один вызов метода mouseDragged(), который изменяет размер popupmenu на долю. Обычно меню должно сохраняться при перетаскивании мышью, как в обычном обновляемом окне. – fsociety

+0

Это не работает. Я столкнулся с подобным ответом [здесь] (https://community.oracle.com/thread/1353549?start=0&tstart=0). Окно верхнего уровня, возвращаемое 'menu.getTopLevelAncestor', является окном jtable, а изменение размера popupmenu изменяет размер всей таблицы. – fsociety

+0

Не можете ли вы установить максимальную ширину столбца? – MircoProgram

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