在JPanel中自动循环滚动活动内容 - 选取框文本

fla*_*and 2 java swing jpanel jscrollpane

我需要一些自动循环滚动(字幕文本)它的内容JPanel.内容必须在鼠标点击不同元素时作出反应.因此,只需绘制移动坐标不能在此处工作的内容,因为元素的实际位置不会改变.它也必须能够更新.最有可能的是它将是平滑更新 - 没有任何弹跳.试图使用JScrollPane没有可见的滚动和自动滚动,它可以保持动作侦听器,但我不能使它顺利循环和平滑更新内容.

更新它应该是这样的:

http://h1.flashvortex.com/display.php?id=2_1311593920_25605_144_0_700_30_6_1_92

但是从代码修改内容,而不停止动画和弹跳.

cam*_*ckr 5

您可以使用Marquee面板.代码使用实际组件,因此您应该能够添加并响应添加到组件的任何侦听器.

编辑:

糟糕,我不知道我在想什么,我的代码使用Graphics.translate(...)方法绘制组件,因此直接使用MouseListener将无法正常工作.

EDIT2:

也许以下代码会有所帮助.只需将方法添加到MarqueePanel类:

public Component getComponentAtPoint(Point p)
{
    int translatedX = p.x + scrollOffset;

    if (isWrap())
    {
        int preferredWidth = super.getPreferredSize().width;
        preferredWidth += getWrapAmount();
        translatedX = translatedX % preferredWidth;
    }

    Point translated = new Point(translatedX, p.y);

    for (Component c: getComponents())
    {
        if (c.getBounds().contains(translated))
            return c;
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以将MouseListener添加到MarqueePanel,然后调用此方法以确定为其生成MouseEvent的组件.一旦知道单击了哪个组件,您将手动需要为该组件调用Action.或者您可以尝试将MouseEvent重新分配到组件.您需要重新创建MouseEvent以使组件成为事件的来源,而不是将面板作为源.您还需要将事件X/Y位置转换为相对于组件而不是面板.SwingUtils类应该对此有所帮助.