【发布时间】:2017-10-05 02:06:35
【问题描述】:
我对幻灯片形式的程序有疑问。我为这个程序添加了两个参数:包含图像的文件夹的路径,图像重新绘制后的时间。 图像应以原始大小绘制,并且窗口会调整为该大小。如果某些文件不会是图像,程序应该绘制“错误”语句。无论如何,该程序根本没有工作,也没有绘制任何图像。任何人都可以告诉我为什么它不绘制任何东西以及 Timer 是否是重新绘制图像的好方法?
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);
}
}
【问题讨论】:
-
"包含图片的文件夹的路径,...如果有些文件不是图片,程序应该画出"ERROR"语句。
paths = dir.list();" 更好用File.list(java.io.FilenameFilter)和FilenameFilter基于从ImageIO.getReaderFileSuffixes()返回的数组..