getResource 未检索源包中的图像

问题描述 投票:0回答:1

我正在尝试使用我发现的视频中的 Ant 幻灯片放映 java。我已经进行了输出,并且出现了窗口,但没有显示任何图像。

我怀疑我做错了与我实现的 getResource 代码相关的事情。我期望 getResource("/newsimages") 能够正常工作并显示所有图像,但事实并非如此。

package pbt2mainpage;
import java.awt.Image;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;

public final class MainPage extends javax.swing.JFrame {

    public MainPage() {
        initComponents();
        show(position);
    }
    
    int position = 0;
public String[] takeimage()
{
    File f = new File(getClass().getResource("/newsimages").getFile());
    String[] Images = f.list();
    return Images;
}

public void show(int index)
{
    String[] Images = takeimage();
    String img = Images[index];
    ImageIcon icon = new ImageIcon(getClass().getResource("/newsimages/")+img);
    Image image = icon.getImage().getScaledInstance(news.getHeight(), news.getWidth(), Image.SCALE_SMOOTH);
    news.setIcon(new ImageIcon(image));
    
}
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        news = new javax.swing.JLabel();
        next = new javax.swing.JLabel();
        previous = new javax.swing.JLabel();
        background = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
        getContentPane().add(news, new org.netbeans.lib.awtextra.AbsoluteConstraints(45, 55, 990, 360));

        next.setIcon(new javax.swing.ImageIcon(getClass().getResource("/pbt2mainpage/next.png"))); // NOI18N
        next.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                nextMousePressed(evt);
            }
        });
        getContentPane().add(next, new org.netbeans.lib.awtextra.AbsoluteConstraints(1040, 200, -1, -1));

        previous.setIcon(new javax.swing.ImageIcon(getClass().getResource("/pbt2mainpage/previous.png"))); // NOI18N
        previous.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                previousMousePressed(evt);
            }
        });
        getContentPane().add(previous, new org.netbeans.lib.awtextra.AbsoluteConstraints(5, 200, -1, -1));

        background.setIcon(new javax.swing.ImageIcon(getClass().getResource("/pbt2mainpage/For CPG.jpg"))); // NOI18N
        getContentPane().add(background, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 1080, 450));

        pack();
    }// </editor-fold>                        

    private void nextMousePressed(java.awt.event.MouseEvent evt) {                                  
        new Thread();
        try {
            Thread.sleep(300);
        } catch (InterruptedException ex) {
            Logger.getLogger(MainPage.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        int p = this.news.getX();
        
        if(p>-1)
        {
          Animacion.Animacion.mover_izquierda(900, 200, 1, 2, news);
        }
        position=position+1;
        if(position>=takeimage().length)
        {
            position=takeimage().length-1;
        }
        show(position);
    }                                 

    private void previousMousePressed(java.awt.event.MouseEvent evt) {                                      
       new Thread();
        try {
            Thread.sleep(300);
        } catch (InterruptedException ex) {
            Logger.getLogger(MainPage.class.getName()).log(Level.SEVERE, null, ex);
        }
        int p=this.news.getX();
        
        if(p>-1)
        {
          Animacion.Animacion.mover_izquierda(900, 200, 1, 2, news);
        }
          position=position-1;
        if(position<0)
        {
            position=0;
        }
        show(position);
    }                                     

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(() -> {
            new MainPage().setVisible(true);
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel background;
    private javax.swing.JLabel news;
    private javax.swing.JLabel next;
    private javax.swing.JLabel previous;
    // End of variables declaration                   
java jframe getresource
1个回答
0
投票

文件的意思是文件。这个:

new File(getClass().getResource("/newsimages").getFile());

不起作用,也无法使其起作用。因为 jar 文件中的那些条目不是文件。它们是 jar 条目。

这就是你如何做到这一点,从你自己的代码稍后在源代码中:

new ImageIcon(getClass().getResource("/newsimages/")+img);

不过,您应该使用

MainPage.class.getResource
(更好的样式;如果您子类化也不会破坏,尽管这在这里似乎不太相关)。

您的代码创建一个文件对象以列出其内容。 这不是您可以做的操作。类加载系统根本没有“列表”原语。

因此,您有几个选择:

  1. 在源代码中或具有已知名称的文本文件中手动维护文件列表。然后,您可以加载该文本文件(例如,使用
    MainPage.class.getResourceAsStream("/all-image-names.txt")
    ),并使用它的内容来了解哪些文件名可用。
  2. 使用各种第三方库破解它。请注意,这些库在各种情况下都会失败。它们在没有模块化或其他定制类加载器基础设施的基本情况下工作。不推荐。
  3. 设置您的构建,以便 it 在构建过程中自动生成此文本文件。毕竟,在构建(编译)阶段,工具肯定有该文件列表。
© www.soinside.com 2019 - 2024. All rights reserved.