0

我有一个 Java Swing 应用程序,并且我为它创建了一个特殊的子 JPopupMenu,它是可滚动的,因此用户可以简单地滚动它并从中选择一个项目,就像在这个屏幕截图中一样:

在此处输入图像描述

我使用了这篇文章中的代码,并将其粘贴在这里,以便您查看: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.
        }
    }
}

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

4

1 回答 1

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 的边界调用它(我使用了带有 mouseentered 的 mouselistener)滚动面板以使项目可见。

希望能帮助到你!

于 2016-07-28T14:29:47.107 回答