Java 制作自动更改图像的幻灯片
我在幻灯片的形式上对程序有问题。我为这个程序添加了两个参数:包含图像的文件夹路径,图像重新绘制后的时间。 图像应以原始大小绘制,窗口应调整为该大小。若一些文件并没有被镜像,程序应该画出“错误”语句。不管怎样,这个程序根本不起作用,也没有画出任何图像。任何人都可以告诉我为什么它不画任何东西,计时器是否是重新绘制图像的好方法Java 制作自动更改图像的幻灯片,java,swing,slideshow,Java,Swing,Slideshow,我在幻灯片的形式上对程序有问题。我为这个程序添加了两个参数:包含图像的文件夹路径,图像重新绘制后的时间。 图像应以原始大小绘制,窗口应调整为该大小。若一些文件并没有被镜像,程序应该画出“错误”语句。不管怎样,这个程序根本不起作用,也没有画出任何图像。任何人都可以告诉我为什么它不画任何东西,计时器是否是重新绘制图像的好方法 public class ImagePanel extends JPanel { Image img; private int period
public class ImagePanel extends JPanel
{
Image img;
private int period;
private int n = 0;
private File[] files;
Timer timer;
Dimension d;
public ImagePanel(File dir, int period)
{
this.period = period;
files = dir.listFiles();
loadImage(files[n++].getPath());
timer = new Timer(period, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//Component component = (Component) e.getSource();
//JFrame f = (JFrame)
//SwingUtilities.windowForComponent(component);
//f.pack();
if (n < files.length)
{
loadImage(files[n].getPath());
}
else
{
repaint();
((Timer)e.getSource()).stop();
}
n++;
}
});
timer.start();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if (img != null)
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
private void loadImage(String imgFileName)
{
img = new ImageIcon(imgFileName).getImage();
int w = img.getWidth(this);
int h = img.getHeight(this);
if (w != -1 && w != 0 && h != -1 && h != 0)
{
d = new Dimension(img.getWidth(this), img.getHeight(this));
}
revalidate();
repaint();
}
@Override
public Dimension getPreferredSize()
{
return new Dimension(img.getWidth(this), img.getHeight(this));
}
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setLayout(new GridLayout(0, 1, 0, 0));
ImagePanel panel = new ImagePanel(new File(args[0]), Integer.parseInt(args[1]) * 1000);
frame.add(panel);
//frame.getContentPane().add(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
公共类ImagePanel扩展了JPanel
{
图像img;
私隐期;
私有整数n=0;
私有文件[]文件;
定时器;
维度d;
公共图像面板(文件目录,整数周期)
{
这个周期=周期;
files=dir.listFiles();
loadImage(文件[n++].getPath());
计时器=新计时器(句点,新ActionListener()
{
已执行的公共无效操作(操作事件e)
{
//组件=(组件)e.getSource();
//JFrame f=(JFrame)
//SwingUtilities.windowForComponent(组件);
//f、 包装();
if(n
定时器是否是重新绘制图像的好方法
是的,您应该使用摆动计时器来安排动画
任何人都可以告诉我为什么它不画任何东西
在ImagePanel
类中,您应该创建一个类似setImage(…)
的方法。每当您想要更改映像时,计时器代码将调用此方法
然后在
setImage(…)
方法中,您需要调用repaint()
来告诉面板重新绘制自身 camickr,我认为我的LoadImage类似于setImage方法,不是吗?我添加了重新绘制,但它仍然不起作用:(@MichałBartoś,那么做一些基本的调试。paintComponent()方法是否执行?loadImage()方法是否被调用?图像是否为空?图像是否加载?我们不知道您遇到了什么问题。我几乎要解决它。我更改了:String[]myList=dir.list();关于文件[]files=dir.listFiles();您能告诉我myList[0]和files[0]之间的区别吗?getPath()?第二个正在工作,但第一个没有。list()方法不返回文件的路径?最后一个问题:图像显示在小窗口中(可能是5x20px)-setPreferredSize()中无法在每个计时器步骤后更改窗口的大小?@MichałBartoś,区别是什么
-您告诉我。是否显示每个对象的toString()表示形式以查看实际文件名是什么?setPreferredSize()无法在每个计时器步骤后更改窗口的大小?
-帧大小不会因为更改帧上组件的大小而更改。您需要打包()框架。我个人认为这不是一个好主意。保持框架大小不变。面板应该添加到JScrollPane中,以防图像太大而无法显示。让用户控制框架大小,而不是应用程序。非常感谢。你是对的,动态更改框架大小可能是一个奇怪的想法,但我只是想尝试一下我从一开始就打包了JFrame(你可以看到我的类浏览器,它在上面扩展了JFrame)。“包含图像的文件夹路径,…如果一些文件不是图像,程序应该绘制“错误”语句。path=dir.list();
”最好使用File.list(java.io.FilenameFilter)
使用基于从ImageIO.getReaderFileSuffix()返回的数组的FilenameFilter
。。