Как заставить прокручиваемое всплывающее меню прокручивать к определенному пункту меню?
У меня есть приложение на 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), прокручивает панель так, что элемент виден.
Надеюсь, поможет!