2014-04-10 73 views
1

我正在創建一個以12 JPanels的網格爲特色的程序。當按下"add image"按鈕時,網格中的第一個JPanel中會出現一個圖像,並且計數器會加1。從此之後,每當再次點擊"add image"時,圖像將被添加到下一個JPanel。出於某種原因,該按鈕僅將圖像添加到第一個JPanel,然後停止工作。這是我到目前爲止的代碼。試圖在多個JPanel中顯示圖像

public class ImageGrid extends JFrame { 

static JPanel[] imageSpaces = new JPanel[12]; 
int imageCounter = 0; 

ImageGrid() { 
    this.setTitle("Image Grid"); 
    setSize(750, 750); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

    JPanel p3 = new JPanel(); 
    p3.setLayout(new GridLayout(3, 4, 10, 5)); 
    p3.setBackground(Color.WHITE); 
    p3.setOpaque(true); 
    p3.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5)); 

    for (int j = 0; j < imageSpaces.length; j++) { 
     imageSpaces[j] = setImageSpace(); 

     p3.add(imageSpaces[j]); 
    } 

    MyButtonPanel p1 = new MyButtonPanel(); 

    add(p1, BorderLayout.SOUTH); 
    add(p3, BorderLayout.CENTER); 

} 

public JPanel setImageSpace() { 

    JPanel test; 
    test = new JPanel(); 
    test.setOpaque(true); 
    test.setPreferredSize(new Dimension(100, 100)); 
    return test; 
} 

class MyButtonPanel extends JPanel implements ActionListener { 

    final JButton addImage = new JButton("Add Image"); 

    ImageIcon lorryPicture = new ImageIcon(ImageGrid.class.getResource("/resources/lorry.png")); 
    JLabel lorryImage = new JLabel(lorryPicture); 

    MyButtonPanel() { 
     add(addImage); 
     addImage.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 

     if (e.getSource() == addImage) { 
      imageSpaces[imageCounter].add(lorryImage); 
      revalidate(); 
      repaint(); 
      imageCounter++; 
     } 
    } 
} 
public static void main(String[] args) { 

    ImageGrid test = new ImageGrid(); 
    test.setVisible(true); 
} 
} 
+0

1)爲了更好地幫助越早,張貼[MCVE(HTTP://計算器。 com/help/mcve)(最小完整和可驗證示例)。這個例子需要導入和兩張圖片。 2)獲取圖像的一種方法是通過熱鏈接到[本答案](http://stackoverflow.com/a/19209651/418556)中看到的圖像。 –

+0

'imageSpaces [imageCounter] .add(lorryImage);'代碼在哪裏載入一個*不同的*圖像? –

+0

我只使用一個圖像來嘗試並將代碼保持在最低限度,因此對於此程序,我只是試圖將相同的圖像添加到每個JPanel中。我推測,隨着計數器遞增,相同的圖像將被添加到imageSpaces數組中的下一個JPanel。但是這不起作用。 – user3120540

回答

1

你應該重新驗證和重新油漆面板,(這是containter受着加法),而不是幀

imageSpaces[imageCounter].add(lorryImage); 
imageSpaces[imageCounter].revalidate(); 
imageSpaces[imageCounter].repaint(); 

Diclaimer:這可工作爲簡單的修復,但也要注意一個組件(在這種情況下你的JLabel lorryImage)只能有一個父容器。上述修補程序仍然有效的原因是因爲您沒有重新驗證並重新繪製前一個面板,所以標籤已添加到該面板。因此,您可能需要考慮正確地進行操作,並在每個面板中添加new JLabel

if (e.getSource() == addImage) { 
    JLabel lorryImage = new JLabel(lorryPicture); 
    imageSpaces[imageCounter].add(lorryImage); 
    imageSpaces[imageCounter].revalidate(); 
    imageSpaces[imageCounter].repaint(); 
    imageCounter++; 
} 

免責聲明2:你應該添加一個檢查,只有當計數小於數組長度添加標籤,以避免ArrayIndexOutOfBoundsException


方筆記

  • 應該從事件調度線程(EDT)運行Swing應用程序。您可以通過在main中包裝代碼SwingUtilities.invokeLater(...)來完成此操作。多見於Initial Threads

  • 你也可以只使用一個JLabel並調用setIcon,而是採用了JPanel

+0

謝謝!我會記下你的建議。 – user3120540