2011-07-25 38 views
2

我需要一些自动循环滚动(滚动字幕文本),它的内容JPanel。它的内容必须在鼠标点击不同元素时作出反应。所以只是绘制移动坐标不能在这里工作的内容,因为元素的真实位置不会改变。 而且它必须是可更新的。最有可能的是它会更新顺畅 - 没有任何反弹。 尽量选用JScrollPane没有可见的滚动条,并自动滚动,它可以容纳动作侦听器,但我不能让它顺利循环和平滑升级的内容。自动循环滚动在JPanel的活动内容 - 滚动字幕文本

UPDATE 它应该是这样的:

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

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

+0

我deleleted我的帖子missunderstood – mKorbel

回答

5

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

编辑:

哎呀,我不知道我在想什么,我的代码使用Graphics.translate(...)方法绘制的组件,以便直接使用的MouseListener将无法正常工作。

编辑2:

也许下面的代码会有所帮助。只需将方法添加到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类应该对此有所帮助。

+0

EAH,那个东西看上去很不错,做工很好,但是MouseListener的工作不正常,我第一次尝试它。对于只显示文字真的很好的东西 – fland

+0

@fiand,也许更新会有所帮助。 – camickr

+0

是的,这是相当不错的工作。谢谢。您应该将其添加到您的源文件 – fland

1

MarqueePanel包括start()stop()方法;它可能使一个很好的起点,但你必须分解出一个update()方法。

附录:作为example使用JLabel,它不能被原位编辑。如果使用JTextField,它可能是最简单的更新相应的模型,Document