JLabel不会显示图像 – NullPointerException

这是我的第一个Java GUI程序,实际上只是我的第二个java程序,所以请放轻松我:)我的程序是大量谷歌搜索和阅读java文档的结果。 我的问题是我有一张52张精灵表,我试图使用subImage将这些卡分别保存到Buffered Image数组,只是为了测试目的,在窗口中显示所有52。 文件位于我确定的正确目录中。 我相信我的问题在于我使用Jlabels,或者只是一个愚蠢的错误。 无论如何,这是我的类,它执行精灵表分割

package gui; import java.awt.GridLayout; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; public class crdimgs extends JPanel {/** * */ static final long serialVersionUID = 1L; public final int width = 10; public final int height = 20; public int rows = 13; public int cols = 5; public BufferedImage image; File cardimg = new File("Cards.jpg"); BufferedImage cards[]; public void loadsplit(File loadimage){ try{ image = ImageIO.read(loadimage); } catch(Exception error){ System.out.print("error"); } cards = new BufferedImage[cols*rows]; } public crdimgs() { loadsplit(cardimg); setLayout(new GridLayout(rows, cols, 1, 1)); int x = 0; int y = 0; int subimg = 0; for( int i = 0; i < rows; i++) { JPanel panel = new JPanel(); cards[subimg] = new BufferedImage(width, height, 5); cards[subimg] = image.getSubimage(x, y, width, height); panel.add(new JLabel(new ImageIcon(cards[subimg]))); add(panel); x+=width; subimg++; } y+=height; x=0; } } } 

而我的主要课程

 package gui; import javax.swing.JFrame; import java.awt.Color; public class cards extends JFrame { private static final long serialVersionUID = 1L; public cards(){ setTitle("Poker"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(1000, 700); setLocationRelativeTo(null); this.getContentPane().setBackground(Color.GREEN); setVisible(true); setResizable(false); add(new crdimgs()); } public static void main(String[] args){ new cards(); } } 

我目前收到的错误是:

 errorException in thread "main" java.lang.NullPointerException at gui.crdimgs.(crdimgs.java:53) at gui.cards.(cards.java:22) at gui.cards.main(cards.java:28) 

可能你的图像是空的,可能是因为你在错误的地方找它,但要找出来,看看哪一行是53。

建议:

  • 从小处开始然后继续。 在您首次成功读取并显示单个图像之前,请勿尝试进行复杂的图像处理。
  • 检查Java正在寻找图像的位置,因为它可能不在您认为的位置。 放System.out.println(System.getProperty("user.dir")); 在你的代码中找出答案。
  • 将所有组件添加到JFrame 调用setVisible(true)
  • 通过打印堆栈跟踪改进您的exception显示代码: error.printStackTrace() (感谢Mad!)。

例如:

 import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.imageio.ImageIO; import javax.swing.*; public class PlayingCardTest { public static void main(String[] args) { String pathToDeck = "http://www.jfitz.com/cards/classic-playing-cards.png"; try { final List cardImgList = CreateCards.createCardIconList(pathToDeck); SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("Moving Cards"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new CardGameTable(cardImgList, frame)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } catch (MalformedURLException e) { e.printStackTrace(); System.exit(-1); } catch (IOException e) { e.printStackTrace(); System.exit(-1); } } } @SuppressWarnings("serial") class CardGameTable extends JLayeredPane { private static final int PREF_W = 600; private static final int PREF_H = 400; private static final Color BASE_COLOR = new Color(0, 80, 0); private static final int CARD_COUNT = 20; private static final int WIDTH_SHOWING = 20; private JPanel basePane = new JPanel(null); public CardGameTable(List cardImgList, final JFrame frame) { basePane.setSize(getPreferredSize()); basePane.setBackground(BASE_COLOR); add(basePane, JLayeredPane.DEFAULT_LAYER); final MyMouseAdapter myMouseAdapter = new MyMouseAdapter(this, basePane); addMouseListener(myMouseAdapter); addMouseMotionListener(myMouseAdapter); for (int i = 0; i < CARD_COUNT; i++) { JLabel card = new JLabel(cardImgList.remove(0)); card.setSize(card.getPreferredSize()); int x = (PREF_W / 2) + WIDTH_SHOWING * (CARD_COUNT - 2 * i) / 2 - card.getPreferredSize().width / 2; int y = PREF_H - card.getPreferredSize().height - WIDTH_SHOWING * 2; card.setLocation(x, y); basePane.add(card); } } @Override public Dimension getPreferredSize() { return new Dimension(PREF_W, PREF_H); } } class MyMouseAdapter extends MouseAdapter { private JLabel selectedCard = null; private JLayeredPane cardGameTable = null; private JPanel basePane = null; private int deltaX = 0; private int deltaY = 0; public MyMouseAdapter(JLayeredPane gameTable, JPanel basePane) { this.cardGameTable = gameTable; this.basePane = basePane; } @Override public void mousePressed(MouseEvent mEvt) { Component comp = basePane.getComponentAt(mEvt.getPoint()); if (comp != null && comp instanceof JLabel) { selectedCard = (JLabel) comp; basePane.remove(selectedCard); basePane.revalidate(); basePane.repaint(); cardGameTable.add(selectedCard, JLayeredPane.DRAG_LAYER); cardGameTable.revalidate(); cardGameTable.repaint(); deltaX = mEvt.getX() - selectedCard.getX(); deltaY = mEvt.getY() - selectedCard.getY(); } } @Override public void mouseReleased(MouseEvent mEvt) { if (selectedCard != null) { cardGameTable.remove(selectedCard); cardGameTable.revalidate(); cardGameTable.repaint(); basePane.add(selectedCard, 0); basePane.revalidate(); basePane.repaint(); selectedCard = null; } } @Override public void mouseDragged(MouseEvent mEvt) { if (selectedCard != null) { int x = mEvt.getX() - deltaX; int y = mEvt.getY() - deltaY; selectedCard.setLocation(x, y); cardGameTable.revalidate(); cardGameTable.repaint(); } } } class CreateCards { private static final int SUIT_COUNT = 4; private static final int RANK_COUNT = 13; public static List createCardIconList(String pathToDeck) throws MalformedURLException, IOException { BufferedImage fullDeckImg = ImageIO.read(new URL(pathToDeck)); int width = fullDeckImg.getWidth(); int height = fullDeckImg.getHeight(); List iconList = new ArrayList(); for (int suit = 0; suit < SUIT_COUNT; suit++) { for (int rank = 0; rank < RANK_COUNT; rank++) { int x = (rank * width) / RANK_COUNT; int y = (suit * height) / SUIT_COUNT; int w = width / RANK_COUNT; int h = height / SUIT_COUNT; BufferedImage cardImg = fullDeckImg.getSubimage(x, y, w, h); iconList.add(new ImageIcon(cardImg)); } } Collections.shuffle(iconList); return iconList; } } 

这表现了:
在此处输入图像描述