我试图设计一个非常简单的图形界面,我将使用装有图标的JLabel添加一些图像:
JFrame Table = new JFrame("Transporter Room");
Table.setSize(600, 600);
Table.setLocationRelativeTo(null);
Table.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Table.setLayout(new GridLayout(2, 2, 20, 20));
我的问题是加载JLabel数组的图标...这样的工作:
JLabel playingCard = new JLabel(CardGUI.getIcon(myCard));
JLabel playingCard2 = new JLabel(CardGUI.getIcon(myCard2));
Table.add(playingCard);
Table.add(playingCard2);
只需注意,CardGUI.getIcon(ob)
只是一个静态方法,可以正确设置目录并加载带有给定卡对象的Icon。
这样的东西也有效(虽然图标不在布局中居中......为什么?):
JLabel playingCard = new JLabel();
JLabel playingCard2 = new JLabel();
playingCard.setIcon(CardGUI.getIcon(myCard));
playingCard2.setIcon(CardGUI.getIcon(myCard));
Table.add(playingCard);
Table.add(playingCard2);
只要我不使用setIcon()
,就可以使用JLabel数组,但重复我的代码以声明两次:
JLabel[] myLabel = new JLabel[2];
myLabel[0] = new JLabel(CardGUI.getIcon(myCard));
myLabel[1] = new JLabel(CardGUI.getIcon(myCard2));
Table.add(myLabel[0]);
Table.add(myLabel[1]);
然而,当我尝试这样做时会出现问题(我需要按照规范执行此操作):
JLabel[] myLabel = new JLabel[2];
myLabel[0].setIcon(CardGUI.getIcon(myCard));
myLabel[1].setIcon(CardGUI.getIcon(myCard2));
Table.add(myLabel[0]);
Table.add(myLabel[1]);
我得到Execption in thread "main" java.lang.NullPointerException
。我不知道为什么。我非常确定图像的目录是完全正常的(由另一个类来处理)。为什么只有在尝试设置阵列中的JLabel时才会出现这种情况?
这是我正在处理的一项任务,我不想使用任何可能更长时间的新代码作为解决方法。它应该是相当简单的,如果我可以通过这一点,我实际上使用for循环将图标加载到JLabel,然后另一个for循环将所有JLabel加载到桌面上(这是另一个类I已经成立)。任何帮助将不胜感激!
答案 0 :(得分:3)
创建JLabel[]
时,您正在创建标签的数组。不是里面的标签。换句话说,在创建数组后,数组元素仍为null
。这就是为什么你的倒数第二位代码可以工作,但你的上一次没有 - 在最后一段代码中,你没有初始化数组中的元素,所以当你尝试在它们上调用一个方法时,你会得到NullPointerException
。