2010-01-26 3 views
1

카드가 JLabel로 표현되고 이름과 게임 중에 변경된 다른 속성을 가진 카드 게임을 만들고 있습니다. 두 개의 카드로 된 전체 이름 (필드 fullName으로 표시)을 비교하는 것으로 평등을 정의하고 싶습니다. 그러나 이것은 다른 카드 클래스의 다른 필드가 있기 때문에 동일한 카드를 두 번 추가 할 수 없다는 문제점을 안겨줍니다.은 JPanel에 구성 요소를 추가 할 때 문제가됩니까?

분명히 JPanel은 백그라운드에서 equals에 대한 일부 확인을합니다. 나는 다음 각 카드에 고유 한 id 필드를 추가하고 수업 시간에 내가 값을 증가 그때

private static Map<AbstractCard, Integer> idCount = new HashMap<AbstractCard, Integer>(); 

과 함께 특정 카드의 생성자가 호출 될 때마다 생성 된 종류의 얼마나 많은 카드를 추적 idCount. 그러나 id과 원래 name의 수표를 추가하면지도가 깨질뿐만 아니라 이름이 같은 경우에도 카드가 두 개 이상 추가되지 않습니다. 다음은이 메소드의 모습입니다.

이 문제를 해결하는 방법에 대한 의견이 있으십니까?

편집 : 내 hashCodefullName.hashCode()을 반환하고 현재 버전에는 id을 추가합니다.

+0

카드가'JLabel'을 확장한다는 것을 의미합니까? –

+0

예, 죄송합니다. 질문을 게시 한 직후에 편집했습니다. –

답변

2

편집

나는 다음과 같은 테스트를하고 괜찮 았는데 않았다

private class MyLabel extends JLabel { 
    public MyLabel(String text) { 
     super(text); 
    } 
    public boolean equals(Object obj) { 
     return true; 
    } 
}; 


public MyPanel() { 
    getContentPane().setLayout(new GridLayout()); 
    getContentPane().add(new MyLabel("Label 1")); 
    getContentPane().add(new MyLabel("Label 2")); 
    getContentPane().add(new MyLabel("Label 3")); 
} 
당신이 직면하고있는 어떤 문제

?

BTW :이 문제가 해결되지 않습니다,하지만 equals에 대한의 JavaDoc은이 방법이


하는 경우를 오버라이드 (override)하는 경우는 hashCode 방법을 오버라이드 (override) 해

주를 말한다 카드가 JLabel으로 확장되고 보유한 모든 카드에 대한 인스턴스를 만들면 equals을 전혀 무시하지 않아도됩니다. 동일한 카드를 두 개의 컨테이너 (또는 한 개의 컨테이너에 두 번)에 추가하지 마십시오. 이것은 실제 카드에서도 작동하지 않습니다.

카드 클래스를 시각적으로 분리하는 것이 더 나은 방법 일 수 있습니다. 스윙 클래스에서 카드를 연장하지 않으셨습니까?

toString을 무시하고 JList에 표시 할 수 있습니다.

+0

내 말은 동일한 이름을 공유하지만 다른 속성이 다른 두 개의 인스턴스를 만들 수 있다는 것입니다. 이 두 카드는 같은 카드가 아니지만 이름이 같기 때문에 "평등하다"고 생각합니다. 상속 대신 컴포지션을 사용하려고했지만 (사실 현재 구성에는 composition이 사용됩니다) 여전히 버그 (기능?)가 있습니다. 둘 이상의 동일한 이름을 추가 할 수 없습니다. –

+0

hashCode에 대한 언급을 잊어 버렸습니다. 질문에 추가되었습니다. 이상한 점은 내가 당신의 예제와 비슷한 것을했을 때 의도 한대로 작동하지만 실제 코드에서 2 개의 "equal"카드와 2 개의 다른 (4 개의 컴포넌트)를 사용하면 getComponentCount에서 3을 얻는다는 것입니다 ? –

+0

다른 문제가있는 것 같습니다. 문제를 재현 할 수있는 한 프로그램에서 항목을 제거하려고 시도 할 수 있으며이 문제의 원인을 확인할 수 있습니다. –

1

HashMaps는 해시 코드에 따라 올바른 "버킷"을 찾은 다음 동등성 테스트를 통해 올바른 요소를 선택합니다. hashCode()를 오버라이드 (override)하지 않는 경우, HashMap가 있어도 아이템을 취득 할 수없는 경우가 있습니다. 일반적으로 항상 equals() 및 hashCode()를 함께 재정의합니다.

그러나 디자인을 다시 생각해 보시기 바랍니다. 이런 종류의 참조 계산은 좋은 생각이 아닙니다. 또한 GUI 코드에 너무 많은 논리 및 모델 요소를 혼합하고 있습니다. Model-View-Controller를 더 많은 문제에 적용하는 것에 대해 생각해야합니다.게임을 완전히 모델링 한 다음 UI가 모델을 나타내도록하십시오.

0

나는 이것에 대해 대단히 유감입니다. 내 자신의 잘못이었던 것처럼 보입니다. 디버깅과 인쇄를 많이 한 후에 다른 패널의 일부인 패널에 참조가 있다는 것을 알았습니다. 그래서 나는 실제로 "정말로"오직 3 장만 가지고있었습니다. 참조를 삭제하고 대신 새 카드를 만들면 마침내 나타나서 getComponentCount이 반환됩니다.

다시 한번 말씀 드리지만 시간을 낭비하게되어 죄송합니다.

+1

맞아요. 다른 문제가있는 것처럼 들리 네. –

0

제쳐두고,이 간단한 소스를 읽는 것이 좋습니다 game. 그것은 카드 게임이 아니지만, GameButton 클래스는 유니 코드 글립 문자를 사용하여 카드의 순위와 소송을 상징하는 방법을 제안합니다.