gpt4 book ai didi

java - 在 Java 中创建动画 JScrollPane 的简单方法?

转载 作者:行者123 更新时间:2023-11-30 11:34:33 25 4
gpt4 key购买 nike

我目前有一个 JScrollPane,它基本上是一个项目列表。此 JScrollPane 将显示在信息屏幕上。

我正在寻找的是某种方法,可以让它以给定的时间间隔自动滚动到列表底部,然后回到顶部。我知道这可能无法使用 JScrollPane 实现,因此任何关于替代方案的建议也很好!

最佳答案

通常我会使用 TimingFramework或者你可以使用类似 Trident 的东西或 Unviversal Tween Engine作为任何动画的基础。主要原因是,除了为您完成大部分工作外,它们还提供可变速度,这将使动画看起来更自然。

但是您可以使用 javax.swing.Timer 实现基本概念。

此示例将允许您滚动到图像底部并再次返回。

动画将持续 5 秒(由 runningTiming 变量提供),允许它可变(图像越大,移动越快,图像越小,移动越慢)。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class AutoScroller {

public static void main(String[] args) {
new AutoScroller();
}
private long startTime = -1;
private int range = 0;
private int runningTime = 5000;
private int direction = 1;

public AutoScroller() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

final JScrollPane scrollPane = new JScrollPane(new TestPane());

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(scrollPane);
// frame.pack();
frame.setSize(scrollPane.getPreferredSize().width, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

Timer timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (startTime < 0) {
startTime = System.currentTimeMillis();
range = scrollPane.getViewport().getView().getPreferredSize().height - scrollPane.getHeight();
}
long duration = System.currentTimeMillis() - startTime;
float progress = 1f;
if (duration >= runningTime) {
startTime = -1;
direction *= -1;
// Make the progress equal the maximum range for the new direction
// This will prevent it from "bouncing"
if (direction < 0) {
progress = 1f;
} else {
progress = 0f;
}
} else {
progress = (float) duration / (float) runningTime;
if (direction < 0) {
progress = 1f - progress;
}
}

int yPos = (int) (range * progress);

scrollPane.getViewport().setViewPosition(new Point(0, yPos));

}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();

}
});
}

public class TestPane extends JPanel {

private BufferedImage image;

public TestPane() {
try {
image = ImageIO.read(new File("Path/to/your/image"));
} catch (IOException ex) {
ex.printStackTrace();
}
}

@Override
public Dimension getPreferredSize() {
return image == null ? new Dimension(200, 200) : new Dimension(image.getWidth(), image.getHeight());
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - image.getWidth()) / 2;
int y = (getHeight() - image.getHeight()) / 2;
g2d.drawImage(image, x, y, this);
g2d.dispose();
}
}
}
}

关于java - 在 Java 中创建动画 JScrollPane 的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com