2015-05-06 123 views
2

代碼非常簡單。我從一個數組列表中得到一個URL字符串。然後我試圖在我的JPanel中繪製圖像。如果我沒有在代碼中初始化一個佈局,它會返回一個錯誤。如果我初始化佈局,則沒有錯誤,但該圖標也不顯示。我錯過了什麼嗎?謝謝!圖片圖標不顯示在JPanel中

public class CharacterPage extends JFrame { 
    private JPanel imagesPanel; 
    private WikiDB wikiDB; 

    public CharacterPage(WikiDB db) throws IOException { 
      super("Character Page"); 
      setContentPane(rootPanel); 
      pack(); 
      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
      setVisible(true); 
      setSize(new Dimension(500,500)); 
      imagesPanel.setLayout(new BorderLayout()); 
      this.wikiDB = db; 

       searchButton.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
       ArrayList<String> characterImages =  
       wikiDB.searchImages(characterID); 
       //array contains this string: http://cosplayidol.otakuhouse.com/wp-content/uploads/2012/06/s-1-1.jpg 

       for (int x = 0; x < characterImages.size(); x++){ 
        String imageURL = characterImages.get(x); 
        Graphics g = getGraphics(); 


        try { 
         URL url = new URL(imageURL); 

         //icon.paintIcon(imagesPanel,g,300,100); 

         JLabel wIcon = new JLabel(new ImageIcon(url)); 

         imagesPanel.setVisible(true); 
         imagesPanel.add(wIcon); 


        } catch (MalformedURLException mue){ 
         mue.printStackTrace(); 
        } 
      } 
     }); 
} 

下面是我用來閱讀我的URL的單獨程序。使用下面的代碼,我可以閱讀我的URL而不會返回任何錯誤,但它仍然不會顯示在GUI中。

public class SimpleGUI extends JFrame { 
private JPanel imagesPanel; 

public SimpleGUI() throws IOException { 
    super("GUI Page"); 
    setContentPane(imagesPanel); 
    pack(); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setVisible(true); 
    setSize(new Dimension(500, 500)); 
    imagesPanel.setLayout(new GridLayout()); 


    BufferedImage img1 = null; 

    try 
    { 
     URL url1 = new URL("http://cosplayidol.otakuhouse.com/wp-content/uploads/2012/06/s-1-1.jpg"); 

     URLConnection conn1 = url1.openConnection(); 
     conn1.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 
     InputStream in1 = conn1.getInputStream(); 

     img1 = ImageIO.read(in1); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 


    JLabel wIcon = new JLabel(new ImageIcon(img1)); 
    imagesPanel.add(wIcon); 

    } 
} 

編輯:我正在在接近我現在可以彈出使用此代碼包含圖片的獨立的框架:

public class SimpleGUI extends JFrame { 
private JPanel imagesPanel; 
private JFrame mainFrame; 

public SimpleGUI() throws IOException { 
    super("GUI Page"); 
    setContentPane(imagesPanel); 
    pack(); 
    setVisible(true); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setSize(new Dimension(500, 500)); 

    mainFrame = new JFrame(); 

    imagesPanel.setLayout(new GridLayout()); 
    imagesPanel.setBounds(0,0,200,200); 
    mainFrame.add(imagesPanel); 
    mainFrame.setVisible(true); 

我似乎無法找到我的GUI原始幀窗體,所以我可以添加imagesPanel來代替。我正在使用IntelliJ的GUI表單構建器。

+2

您需要調試 - 根本不需要讀取圖像工作嗎?創建一個簡單的GUI,其中一個讀入Image(使用'ImageIO.read(URL url)'),創建一個ImageIcon並在JOptionPane中顯示該圖標。如果這有效,那麼問題在別處。如果它不能糾正URL地址。 –

+0

嗨Hovercraft,我能夠創建一個簡單的程序,糾正讀取和顯示圖片,但我不能以原始的GUI形式/框架顯示;我必須創建一個新的。我用新代碼編輯了我的問題。有任何想法嗎?謝謝! – Michelle

+0

Michelle,新代碼只顯示您在新窗口中顯示圖片。直到您提煉出原始程序之前,我無法確定您的問題是什麼。最好爲你嘗試創建併發布[最小代碼示例](http://sscce.org)。 –

回答

3

一個問題是,您嘗試在for循環中使用JPanel將多個組件添加到BorderLayout中,通過這樣做,您將覆蓋之前添加的所有內容,並添加新的任何內容。改爲使用更合適的佈局,例如GridLayout。

另一個問題,你在哪裏添加imagesPanel到任何東西?調用setVisible(true)就沒有用處,但將其添加到JFrame或最終由JFrame保存的JPanel中會有很大幫助。

此外,你需要做一些嚴肅的調試,通常之前來到這裏 - 你的圖像工作的讀書嗎?創建一個簡單的GUI,其中一個讀入圖像(爲此使用ImageIO.read(URL url)),創建一個ImageIcon並在JOptionPane中顯示該圖標。如果這有效,那麼問題在別處。如果它不能糾正URL地址。