我有一个Java Swing应用程序,我为它创建了一个特殊的子JPopupMenu,它是可滚动的,因此用户只需滚动浏览它并从中选择一个项目,就像在这个截图中一样:
我使用了this post中的代码并将其粘贴在此处,以便您查看:http://codeshare.io/Jgqa7
现在,如果用户已经从该子菜单中打开了已经为其选择的项目的子菜单,那么我想自动滚动到所选项目以显示它,就像ensureIndexIsVisible一样( ...)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.
}
}
}
由于某种原因,它不会滚动到我想要的项目!
答案 0 :(得分:0)
我还需要一个滚动的解决方案。由于我没有找到滚动窗格,我需要在JScrollPopupMenu中实现自己的scrollRectToVisible方法:
@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(我使用带有鼠标的鼠标滑块)的边界调用此方法,滚动面板以使项目可见。
希望它有所帮助!