2014-05-10 3 views
0

JPanel에 아이콘을 표시하기 위해 복합 디자인 패턴을 사용하려고합니다. Icon을 확장하고 IconImage를 구현하고 ImageIcon을 확장하는 사용자 정의 클래스를 보유하는 ArrayList를 가진 복합 클래스가 있습니다. composites paintIcon() 메서드를 호출하고 ArrayList를 반복하고 포함 된 모든 아이콘을 페인트하고 싶습니다. ImageIcon을 호출하고 내 패널에 추가하면 아이콘을 화면에 그릴 수 있습니다. CompositeIcon에서 호출 된 paintIcon()이 작동하지 않는 이유를 모르겠습니다. 다음 메소드는 ArrayList를 반복하지만 화면에서 인쇄하지는 않습니다. GUI에서 setIcon()을 호출하면 JPanel에 페인트하지 않아야합니까?아이콘 인터페이스로 복합 디자인 패턴 사용

public class Display extends JFrame { 


public CompositeIcons icons = new CompositeIcons(); 



public Display() throws MalformedURLException{ 
    super(); 

    this.setTitle("Composite Pattern"); 
    this.setSize(600, 600); 
    this.setLocationRelativeTo(null); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //this.setResizable(false); 
    this.setLayout(new FlowLayout()); 


    ImageIcon image = new ImageIcon("discover.png"); 
    IconOne iconOne = new IconOne("discover.png");  

    icons.addIcon(iconOne, 10, 10); 

    JPanel panel = new JPanel(); 
    JLabel label = new JLabel(); 
    label.setIcon(icons); 
    panel.add(label); 
    panel.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1, true)); 
    panel.setPreferredSize(new Dimension(100,100)); 
    this.add(panel); 
    this.setVisible(true); 
} 

} 

및 복합 클래스 :

public class CompositeIcons implements Icon { 

private ArrayList<Icon> icons = new ArrayList(); 
private ArrayList<Integer> listX = new ArrayList(); 
private ArrayList<Integer> listY = new ArrayList(); 



public void addIcon(Icon icon, int x, int y){ 
    icons.add(icon); 
    listX.add(x); 
    listY.add(y); 
} 




@Override 
public void paintIcon(Component c, Graphics g, int i, int i1) { 
    for(int j = 0; j < icons.size(); j++){ 
     icons.get(j).paintIcon(c, g, listX.get(j), listY.get(j)); 
    } 
} 

@Override 
public int getIconWidth() { 
    return 40; 
} 

@Override 
public int getIconHeight() { 
    return 40; 
} 

} 

및 샘플 사용자 정의 아이콘 클래스 :

public class IconOne extends ImageIcon implements Icon { 

ImageIcon image; 
int x, y; 



public IconOne(String icon){ 
    super(icon); 

} 





@Override 
public void paintIcon(Component cmpnt, Graphics grphcs, int i, int i1) { 

} 

@Override 
public int getIconWidth() { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public int getIconHeight() { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 
+0

paintIcon의 마지막 두 인수는 구성 요소에서 아이콘을 그릴 위치를 지정하는 x 및 y입니다. 너는 그들을 무시하고있어. 'icons.get (j) .paintIcon (c, g, x + listX.get (j), y + listY.get (j));'와 같이 올바르게 전달해야합니다. 또한 IconOne의 paintIcon() 메서드는 비어 있으므로 아무 것도 표시 할 기회가 없습니다. – schmop

답변

0

는 paintIcon를 제거

@Override 
public void paintIcon(Component c, Graphics g, int i, int i1) { 
    for(int j = 0; j < icons.size(); j++){ 
     icons.get(j).paintIcon(c, g, listX.get(j), listY.get(j)); 
    } 
} 

은 지금까지 나는 테스터가 메서드를 IconOne에서 호출합니다. 이 클래스는 이미 그것을 구현하는 ImageIcon을 확장합니다.