我在节目幻灯片中遇到了问题。我为这个程序添加了两个参数:包含图像的文件夹路径,图像重绘后的时间。 图像应以原始大小绘制,窗口调整为该大小。如果某些文件不是图像,程序应绘制" ERROR"声明。无论如何,该程序根本无法工作,它无法绘制任何图像。任何人都可以告诉我为什么它没有画任何东西以及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);
}
}
答案 0 :(得分:2)
Timer是否是重绘图像的好方法?
是的,您应该使用Swing Timer来安排动画。
任何人都可以告诉我它为什么没有画任何东西
在ImagePanel
课程中,您应该创建一个类似setImage(...)
的方法。每当您想要更改图像时,Timer代码都会调用此方法。
然后在setImage(...)
方法中,您需要调用repaint()
告诉小组重新绘制自己。