为什么我的图像没有添加到我的 JButtons?



我有一个程序,它由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);
}
}

任何帮助将不胜感激。谢谢!

在回答您的问题之前,请阅读以下建议:

  1. private static JButton[] bIcons = new JButton[4];创建static字段可能会破坏程序,因此在使用它们时要小心。在这种情况下不是真的需要,请阅读"static"关键字在类中做什么?

  2. JFrame是一个刚性的容器,不能放在其他容器内部,并且您不会在程序中的任何位置更改它的功能,因此无需调用extends JFrame,最好创建一个JFrame实例。请参阅:扩展 JFrame 与在程序内创建 JFrame 以获取有关此内容的更多信息。

  3. 您正确地调用了pack()但是稍后在代码中调用frame.setSize(315,315);"破坏"pack()所做的更改,使用一个或另一个,而不是两个,我建议您离开pack()调用。

  4. 您不会将程序放在事件调度线程 (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(仔细查看扩展名)
  • 您的图像已损坏

相关内容

  • 没有找到相关文章