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