我需要一些自动循环滚动(字幕文本)它的内容JPanel
。内容必须在鼠标点击不同元素时作出反应。因此,只需绘制移动坐标不能在此处工作的内容,因为元素的实际位置不会改变。
它也必须能够更新。最有可能的是它将是平滑更新 - 没有任何弹跳。
试图使用没有可见滚动条和自动滚动的JScrollPane
,它可以保存动作侦听器,但我无法顺利循环并平滑更新内容。
UPDATE 它应该是这样的:
http://h1.flashvortex.com/display.php?id=2_1311593920_25605_144_0_700_30_6_1_92
但是从代码修改内容,而不停止动画和弹跳。
答案 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
。