Java Swing 中的跑马灯效果
如何在Java Swing中实现跑马灯效果
How can I implement Marquee effect in Java Swing
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何在Java Swing中实现跑马灯效果
How can I implement Marquee effect in Java Swing
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
下面是一个使用 javax.swing.Timer 的示例。
Here's an example using
javax.swing.Timer
.我知道这是一个迟到的答案,但我刚刚看到另一个关于已关闭的字幕的问题,因为它被认为是该答案的重复。
所以我想我应该添加我的建议,该建议采用与此处建议的其他答案不同的方法。
MarqueePanel 滚动面板上的组件,而不仅仅是文本。因此,这使您可以充分利用任何 Swing 组件。通过添加带有文本的 JLabel 可以使用简单的选取框。更高级的选取框可能会使用带有 HTML 的 JLabel,这样您就可以为文本使用不同的字体和颜色。您甚至可以添加带有图像的第二个组件。
I know this is a late answer, but I just saw another question about a marquee that was closed because it was considered a duplicate of this answer.
So I thought I'd add my suggestion which takes a approach different from the other answers suggested here.
The MarqueePanel scrolls components on a panel not just text. So this allows you to take full advantage of any Swing component. A simple marquee can be used by adding a JLabel with text. A fancier marquee might use a JLabel with HTML so you can use different fonts and color for the text. You can even add a second component with an image.
基本答案是您将文本/图形绘制到位图中,然后实现一个以一定量绘制位图偏移的组件。通常选取框/滚动条向左滚动,因此偏移量增加,这意味着位图绘制在 -offset 处。您的组件运行一个定期触发的计时器,增加偏移量并使自身无效,以便重新绘制。
像包装这样的事情处理起来有点复杂,但相当简单。如果偏移量超过位图宽度,则将其重置回 0。如果偏移量 + 组件宽度 >位图宽度 您从位图的开头开始绘制组件的其余部分。
一个像样的股票行情指示器的关键是使滚动尽可能平滑且无闪烁。因此,可能有必要考虑对结果进行双缓冲,首先将滚动位绘制到位图中,然后一次性渲染它,而不是直接绘制到屏幕中。
Basic answer is you draw your text / graphic into a bitmap and then implement a component that paints the bitmap offset by some amount. Usually marquees / tickers scroll left so the offset increases which means the bitmap is painted at -offset. Your component runs a timer that fires periodically, incrementing the offset and invalidating itself so it repaints.
Things like wrapping are a little more complex to deal with but fairly straightforward. If the offset exceeds the bitmap width you reset it back to 0. If the offset + component width > bitmap width you paint the remainder of the component starting from the beginning of the bitmap.
The key to a decent ticker is to make the scrolling as smooth and as flicker free as possible. Therefore it may be necessary to consider double buffering the result, first painting the scrolling bit into a bitmap and then rendering that in one go rather than painting straight into the screen.
下面是我整理的一些代码,供您入门。我通常会采用 ActionListener 代码并将其放入某种
MarqueeController
类中,以使此逻辑与面板分开,但这是关于组织 MVC 架构的不同问题,并且在一个足够简单的类中,例如这或许并不是那么重要。还有各种动画库可以帮助您做到这一点,但我通常不喜欢将库包含到项目中只是为了解决这样的一个问题。
Here is some code that I threw together to get you started. I normally would take the ActionListener code and put that in some sort of
MarqueeController
class to keep this logic separate from the panel, but that's a different question about organizing the MVC architecture, and in a simple enough class like this it may not be so important.There are also various animation libraries that would help you do this, but I don't normally like to include libraries into projects only to solve one problem like this.
将 JLabel 添加到框架或面板。
Add a JLabel to your frame or panel.
这应该是@camickr MarqueePanel 的改进。请参阅上文。
将鼠标事件映射到添加到 MarqueePanel 的特定组件
重写 MarqueePanel 的
add(Component comp)
以引导组件的所有鼠标事件这里的问题是如何处理从单个组件激发的 MouseEvents成分。
我的方法是从添加的组件中删除鼠标侦听器,并让 MarqueePanel 将事件重定向到正确的组件。
就我而言,这些组件应该是链接。
然后将组件x映射到MarqueePanel x,最后是正确的组件
This is supposed to be an improvement of @camickr MarqueePanel. Please see above.
To map mouse events to the specific components added to MarqueePanel
Override
add(Component comp)
of MarqueePanel in order to direct all mouse events of the componentsAn issue here is what do do with the MouseEvents fired from the individual components.
My approach is to remove the mouse listeners form the components added and let the MarqueePanel redirect the event to the correct component.
In my case these components are supposed to be links.
Then map the component x to a MarqueePanel x and finally the correct component