【问题标题】:Making slideshow which will automatically change images制作将自动更改图像的幻灯片
【发布时间】: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() 返回的数组..

标签: java swing slideshow


【解决方案1】:

Timer 是否是重绘图像的好方法?

是的,您应该使用 Swing Timer 来安排动画。

谁能告诉我为什么它不画任何东西

在您的ImagePanel 类中,您应该创建一个类似setImage(...) 的方法。每当您要更改图像时,计时器代码都会调用此方法。

然后在setImage(...) 方法中,您需要调用repaint() 来告诉面板重新绘制自身。

【讨论】:

  • camickr,我认为我的 LoadImage 有点像 setImage 方法,不是吗?我添加了重绘,但它仍然不起作用:(
  • @MichałBartoś,所以做一些基本的调试。 paintComponent() 方法是否执行?是否调用了 loadImage() 方法?图片是空的吗?图片加载了吗?我们无法判断您遇到了什么问题。
  • 我快要解决它了。我改变了: String[] myList = dir.list();在文件 [] 文件 = dir.listFiles();你能告诉我例如之间有什么区别吗?我的列表[0];和 files[0].getPath() ?第二个正在工作,但第一个不行。 list() 方法不返回文件的路径?最后一个问题:图像显示在小窗口中(可能是 5x20 像素) - setPreferredSize() 在每个 Timer 步骤后无法更改窗口大小?
  • @MichałBartoś,what is difference - 你告诉我。您是否显示了每个对象的 toString() 表示以查看实际文件名是什么? setPreferredSize() couldn't change size of the window after each Timer step? - 框架大小不会因为您更改框架上组件的大小而改变。您需要 pack() 框架。个人认为这不是一个好主意。只需保持帧大小固定即可。面板应添加到 JScrollPane 以防图像太大而无法显示。让用户控制帧大小,而不是您的应用程序。
  • 非常感谢。你说得对,动态改变帧大小可能是个奇怪的主意,但我只是想尝试一下。我在开始时打包了 JFrame(你可以在上面看到我的类 Browser 扩展了 JFrame)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 2011-03-23
  • 2015-04-21
  • 1970-01-01
  • 2023-01-26
相关资源
最近更新 更多