2014-04-10 5 views
1

그리드가인 프로그램을 만들고 있습니다. "add image" 단추를 누르면 그림이 표의 첫 번째 JPanel에 나타나고 카운터가 1 씩 증가합니다. 그 이후부터는 "add image"을 다시 클릭 할 때마다 이미지가 다음 JPanel에 추가됩니다. 어떤 이유로 단추는 첫 번째 JPanel에 이미지를 추가 한 다음 작동을 멈 춥니 다. 지금까지 제가 가지고있는 코드는 다음과 같습니다.여러 JPanels에서 이미지를 표시하려고 시도합니다.

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을 사용하는 JLabel를 사용하고 setIcon 부를 수있는 더 Initial Threads

  • 에서 참조 [MCVE] (HTTP를 게시 할 수 있습니다. co.kr/help/mcve) (최소한의 완전하고 검증 가능한 예). 이 예는 수입과 2 개의 이미지가 필요합니다. 2) 예를 들어 이미지를 얻는 한 가지 방법은 [이 답변] (http://stackoverflow.com/a/19209651/418556)에 표시된 이미지에 핫 링크하는 것입니다. –

  • +0

    'imageSpaces [imageCounter] .add (lorryImage);'어디에서 코드가 * 다른 * 이미지를로드합니까? –

    +0

    코드를 최소한으로 유지하기 위해 하나의 이미지 만 사용 했으므로이 프로그램에서는 각 JPanel에 동일한 이미지를 추가하려고했습니다. 나는 카운터가 증가함에 따라 같은 이미지가 imageSpaces Array 내의 다음 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 (Event Dispatch Thread)에서 실행해야합니다. main에있는 코드를 SwingUtilities.invokeLater(...)에 배치하여이 작업을 수행 할 수 있습니다. // 유래 : 또한 단지 대신에 더 도움이 빨리 용) JPanel

    +0

    감사합니다. 당신의 충고에 유의할 것입니다. – user3120540

    관련 문제