我有一个程序,它由JFrame中的四个JButton组成。我想将图像添加到JButtons。问题是我似乎无法添加它们,尽管尝试了多种方法。编译时,输出为input == null
。图像存储在与.java
文件相同的文件夹中,因此我无法弄清楚它们为什么不显示。
主要课程:
import java.awt.GridLayout;
import java.awt.Image;
import javax.imageio.ImageIO;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class AutoProgram extends JFrame {
private static String[] files = {"workA","programmingA","leisureA","writingA"};
private static JButton[] bIcons = new JButton[4];
private static Image[] bImg = new Image[4];
public AutoProgram() {
super("Automation Project V.1");
JPanel autoIcons = new JPanel();
autoIcons.setLayout(new GridLayout(2,2));
// Initialize the four buttons (w/ images)
for(int i = 0; i < files.length; i++) {
bIcons[i] = new JButton();
try {
bImg[i] = ImageIO.read(getClass().getResource(files[i].toLowerCase() + ".png"));
bIcons[i].setIcon(new ImageIcon(bImg[i]));
} catch (Exception ex) {
System.out.println(ex);
}
autoIcons.add(bIcons[i]);
}
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));;
mainPanel.add(autoIcons);
add(mainPanel);
pack();
}}
窗口类:
public class Window {
public static void main(String[] args) {
AutoProgram frame = new AutoProgram();
frame.setSize(315,315);
frame.setLocationRelativeTo(null);
frame.setFocusable(true);
frame.setResizable(true);
frame.setVisible(true);
}
}
非常感谢任何帮助。谢谢!
答案 0 :(得分:2)
在回答您的问题之前,请阅读以下建议:
private static JButton[] bIcons = new JButton[4];
创建static
字段可能会破坏您的程序,因此在使用它们时要小心。在这种情况下并不需要,请阅读What does the 'static' keyword do in a class?
JFrame
是一个刚性的容器,不能放在其他人的容器中,而且你的程序中的任何地方都没有改变它的功能,所以不需要调用extends JFrame
,最好是然后创建一个JFrame
实例。有关详细信息,请参阅:Extends JFrame vs. creating it inside the program。
您正在正确拨打pack()
,但稍后您正在调用的代码frame.setSize(315,315);
“{销毁”pack()
所做的更改,请使用其中一个,不是两者,我建议您离开pack()
来电。
您没有将自己的计划放在Event Dispatch Thread(EDT)中,可以通过更改main(...)
方法进行修复,如下所示:
public static void main (String args[]) {
//Java 7 and below
SwingUtilities.invokeLater(new Runnable() {
//Your code here
});
//Java 8 and higher
SwingUtilities.invokeLater(() -> {
//Your code here
});
}
现在,我们来解决方案:
您的代码运行正常,我认为您的错误可能来自以下可能性:
files[i].toLowerCase()
(.toLowerCase()
方法可能会破坏您的程序,Java区分大小写。)