我正在尝试将一个充满图像的文件读入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();
}
我不知道为什么在运行程序时没有显示图像。即使是后面的JLabel图像也不会在运行时显示。任何帮助表示赞赏!!
答案 0 :(得分:1)
让我们从File#list
开始将返回包含在指定文件位置内的File
个对象数组,这样做
cards[i] = new ImageIcon(Arrays.toString(images.list()));
非常令人担忧,原因有两个,除了您只是将文件列表转换为String
之外,执行此操作cards.length
的效率非常低......
接下来,您不应在代码中的任何路径中引用src
,一旦构建和打包,src
将不再存在,您将无法访问您的&#34 ;文件&#34;像普通文件一样(因为它们可能会嵌入你的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]);
}
有关阅读/加载图片的详细信息,请查看Reading/Loading an Image
另一种解决方案可能是创建一个文本文件,该文件可以存储在应用程序上下文中,该文件列出了所有卡名称。您可以使用Class#getResource
或Class#getResourceAsStream
加载文件,阅读内容并加载每张图片......