Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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将图像从文件读入ArrayList并显示在JPanel上_Java_Swing_User Interface_Jlabel_Imageicon - Fatal编程技术网

Java将图像从文件读入ArrayList并显示在JPanel上

Java将图像从文件读入ArrayList并显示在JPanel上,java,swing,user-interface,jlabel,imageicon,Java,Swing,User Interface,Jlabel,Imageicon,我试着把一个满是图像的文件读入ArrayList,制作一副卡片。然后在JPanel上显示它。这是我的密码: private static class CardDealer extends JFrame { private ImageIcon[] cards = new ImageIcon[52]; private ArrayList<ImageIcon> deck = new ArrayList<ImageIcon>();

我试着把一个满是图像的文件读入ArrayList,制作一副卡片。然后在JPanel上显示它。这是我的密码:

   private static class CardDealer extends JFrame 
{        
    private ImageIcon[] cards = new ImageIcon[52];
    private ArrayList<ImageIcon> deck = new ArrayList<ImageIcon>();




    private JButton deal;
    private JPanel faceDown, faceUp, button;
    private JLabel backs, fronts;
    private Random card = new Random(52);


    public CardDealer() throws FileNotFoundException
    {

       File images = new File("src/Images");
       Scanner file = new Scanner(images);
       for(int i=0; i<cards.length; i++)
       {

            cards[i] = new ImageIcon(Arrays.toString(images.list()));

            deck.add(cards[i]);
        }


        //setTitle to set the title of the window

        setTitle("Card Dealer");

        //set the application to close on exit

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Call all our build panel methods
        buildButtonPanel();
        buildFaceDownPanel();
        buildFaceUpPanel();

        setLayout(new BorderLayout());

        add(button, BorderLayout.SOUTH);
        add(faceDown, BorderLayout.WEST);
        add(faceUp, BorderLayout.EAST);

        pack();

        validate();

        setVisible(true);
    }

    private void buildButtonPanel()
    {
        button = new JPanel();

        deal = new JButton("Deal");

        deal.addActionListener(new buttonListener());

        button.add(deal);

    }

    private void buildFaceDownPanel()
    {
        faceDown = new JPanel();

        backs = new JLabel();

        backs.setText("Cards");

        backs.setIcon(new ImageIcon("Blue.bmp"));



        faceDown.add(backs);

    }

    private void buildFaceUpPanel()
    {
        faceUp = new JPanel();

        fronts = new JLabel();

        faceUp.add(fronts);
    }

    private class buttonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
           fronts.setIcon(deck.get(card.nextInt()));
        }
    }

}


public static void main(String[] args) throws FileNotFoundException
{
    new CardDealer();
}
私有静态类CardDealer扩展JFrame
{        
私有ImageIcon[]卡=新ImageIcon[52];
private ArrayList deck=new ArrayList();
私人杰布顿交易;
私人JPanel面朝下,面朝上,按钮;
私用JLabel背部、前部;
私人随机卡=新随机卡(52);
公共卡经销商()抛出FileNotFoundException
{
文件图像=新文件(“src/images”);
扫描仪文件=新扫描仪(图像);
对于(int i=0;iLets start with
File#list
将返回包含在指定文件位置内的
File
对象数组,这使得

cards[i] = new ImageIcon(Arrays.toString(images.list()));
非常令人担忧的原因有两个,除了简单地将文件列表转换为
字符串
,这样做
卡片。长度
效率极低

接下来,您不应该在代码中的任何路径中引用
src
,一旦构建和打包,
src
将不再存在,并且您将无法像普通文件一样访问“文件”(因为它们可能嵌入到jar文件中)

这引发了另一个问题,因为列出嵌入到jar文件中的资源并不容易(当您甚至不知道jar文件的名称时),您需要一种不同的方法

一种可能是以常见的顺序方式命名图像,例如
/images/Card0.png
/images/Card1.png
,然后通过循环加载图像

File images = new File("src/Images");
for(int i=0; i < cards.length; i++)
{
    cards[i] = new ImageIcon(
                       ImageIO.read(
                           getClass().getResource("/images/Card" + i + ".png")));
    deck.add(cards[i]);
}
File images=新文件(“src/images”);
对于(int i=0;i
有关读取/加载图像的更多详细信息,请参阅


另一个解决方案可能是创建一个文本文件,该文件可以存储在应用程序上下文中,列出所有卡片名称。您可以使用
Class#getResource
Class#getResourceAsStream
加载文件,读取其内容并加载每个图像…

两件事,永远不要在任何路径中引用
src
,其次,一旦图像存储在应用程序目录中,您将无法再像读取普通文件一样读取它们