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

时间:2011-07-25 09:59:00

标签: java swing jpanel jscrollpane

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

UPDATE 它应该是这样的:

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

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

2 个答案:

答案 0 :(得分:5)

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

编辑:

糟糕,我不知道我在想什么,我的代码使用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;
}

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

答案 1 :(得分:1)

MarqueePanel包含start()stop()方法;它可能是一个有用的起点,但你必须考虑update()方法。

附录:由于example使用JLabel,因此无法在原地编辑 。如果使用JTextField,则最简单的方法是更新相应的模型Document