2017-06-08 103 views
2

我有一個程序,由JFrame中的四個JButton組成。我想添加圖像到JButtons。問題是我似乎無法添加它們,儘管嘗試了多種方法。編譯時,輸出爲input == null。這些圖像與我的.java文件存儲在相同的文件夾中,所以我無法弄清楚它們爲什麼不顯示。爲什麼我的圖片沒有添加到我的JButton中?

主要類:

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); 
    } 
} 

任何幫助將不勝感激。謝謝!

回答

2

再進回答你的問題,請閱讀以下建議:

  1. private static JButton[] bIcons = new JButton[4];創建static領域可能會破壞你的程序,所以要小心時使用它們。不是真的需要在這種情況下,請閱讀What does the 'static' keyword do in a class?

  2. JFrame是剛性容器不能放在裏面別人,你不改變其functionallity隨時隨地在你的程序,所以沒有必要調用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 
        }); 
    } 
    

現在,讓我們去解決方案:

您的代碼正常工作,我認爲您的錯誤可能來自以下可能性:

  • 調用files[i].toLowerCase().toLowerCase()方法可能會破壞您的程序,Java區分大小寫)。
  • 您的圖片不是PNG,但JPG或JPEG(在擴展仔細看)
  • 您的圖片損壞
+0

感謝您的建議/信息!儘管我仔細檢查過他們的名字和擴展名,但我仍然無法顯示我的圖像。我也刪除了'.toLowerCase',但是這並沒有解決它。圖像沒有損壞,因爲我嘗試了使用按鈕的其他圖像,他們也沒有工作。看來我的方法根本就不是工作期。 :/ – SputnicK

+0

仔細檢查大寫字母的名稱,雙點等...它的工作原理與我自己的一些圖像一起運行,檢查圖像與您所說的相同,這些都是我最好的投注 – Frakcool

+0

Did我的答案真的解決了你的問題?你有它的工作? @SputnicK – Frakcool

相關問題