如何强制滚动弹出菜单滚动到特定菜单项?

时间:2014-08-04 09:06:15

标签: java swing jmenu jpopup

我有一个Java Swing应用程序,我为它创建了一个特殊的子JPopupMenu,它是可滚动的,因此用户只需滚动浏览它并从中选择一个项目,就像在这个截图中一样:

enter image description here

我使用了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.
        }
    }
}

由于某种原因,它不会滚动到我想要的项目!

1 个答案:

答案 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(我使用带有鼠标的鼠标滑块)的边界调用此方法,滚动面板以使项目可见。

希望它有所帮助!