我有一个程序,它由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);
}
}
任何帮助将不胜感激。谢谢!
在回答您的问题之前,请阅读以下建议:
-
private static JButton[] bIcons = new JButton[4];
创建static
字段可能会破坏程序,因此在使用它们时要小心。在这种情况下不是真的需要,请阅读"static"关键字在类中做什么? -
JFrame
是一个刚性的容器,不能放在其他容器内部,并且您不会在程序中的任何位置更改它的功能,因此无需调用extends JFrame
,最好创建一个JFrame
实例。请参阅:扩展 JFrame 与在程序内创建 JFrame 以获取有关此内容的更多信息。 -
您正确地调用了
pack()
但是稍后在代码中调用frame.setSize(315,315);
"破坏"pack()
所做的更改,使用一个或另一个,而不是两个,我建议您离开pack()
调用。 -
您不会将程序放在事件调度线程 (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 区分大小写)。 - 您的图像不是PNG,而是JPG或JPEG(仔细查看扩展名)
- 您的图像已损坏