Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 制作自动更改图像的幻灯片_Java_Swing_Slideshow - Fatal编程技术网

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
。。