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

时间:2017-06-08 18:04:47

标签: java image swing null jbutton

我有一个程序,它由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 个答案:

答案 0 :(得分:2)

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

  1. private static JButton[] bIcons = new JButton[4];创建static字段可能会破坏您的程序,因此在使用它们时要小心。在这种情况下并不需要,请阅读What does the 'static' keyword do in a class?

  2. JFrame是一个刚性的容器,不能放在其他人的容器中,而且你的程序中的任何地方都没有改变它的功能,所以不需要调用extends JFrame,最好是然后创建一个JFrame实例。有关详细信息,请参阅:Extends JFrame vs. creating it inside the program

  3. 您正在正确拨打pack(),但稍后您正在调用的代码frame.setSize(315,315);“{销毁”pack()所做的更改,请使用其中一个,不是两者,我建议您离开pack()来电。

  4. 您没有将自己的计划放在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
        });
    }
    
  5. 现在,我们来解决方案:

    您的代码运行正常,我认为您的错误可能来自以下可能性:

    • 调用files[i].toLowerCase().toLowerCase()方法可能会破坏您的程序,Java区分大小写。)
    • 您的图片不是PNG,而是JPG或JPEG(仔细查看扩展名)
    • 您的图片已损坏