Как заставить прокручиваемое всплывающее меню прокручивать к определенному пункту меню?

У меня есть приложение на Java Swing, и я создал для него специальную подпрограмму JPopupMenu, которую можно прокручивать, чтобы пользователь мог просто прокрутить ее и выбрать из нее один элемент, как на этом скриншоте:

Я использовал код из этого поста и вставил его сюда, чтобы вы могли проверить его: http://codeshare.io/Jgqa7

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

-------------------------------------------------- ------> Редактировать: код, который я использую:

Я попытался использовать этот код для принудительной прокрутки к пункту "изобретен" в прокручиваемом меню, но это не удалось:

JScrollPopupMenu pm = (JScrollPopupMenu)myPopupMenu.getPopupMenu();

for( Component comp: myPopupMenu.getMenuComponents() ) {
    if( comp instanceof JRadioButtonMenuItem ) {
        JRadioButtonMenuItem rb = (JRadioButtonMenuItem)comp;

        if( rb.getText().equals( "invented" ) ) {
            myPopupMenu.scrollRectToVisible( rb.getBounds() );  // Does nothing.
            pm.setSelected( rb );  // Does nothing.
        }
    }
}

По какой-то причине он не прокручивает до нужного мне элемента!

1 ответ

Решение

Мне нужно решение для прокрутки, а также. Поскольку я не нашел область прокрутки, мне нужно было реализовать собственный метод scrollRectToVisible в JScrollPopupMenu:

@Override
public void scrollRectToVisible(Rectangle t){
    // need to adjust scrollbar position
    if (t.getY()<0){
        // scroll up
        JScrollBar scrollBar = getScrollBar();
        scrollBar.setValue(scrollBar.getValue() + (int)(t.getY()));
    }else if (t.getY()+t.getHeight()>getBounds().getHeight()){
        // scroll down
        JScrollBar scrollBar = getScrollBar();
        scrollBar.setValue(scrollBar.getValue() - (int)(getBounds().getHeight()-t.getY()-t.getHeight()));
    }
    doLayout();
    repaint();
}

Вызов этого через границы JMenuItem, по которому щелкнули (я использовал mouselistener с mouseentered), прокручивает панель так, что элемент виден.

Надеюсь, поможет!

Другие вопросы по тегам