2011-12-26 3 views
2

각 플레이어가 3x3 그리드를 채우고 모두 그리드의 상태가 다른 게임을 만듭니다 (플레이어 개체는 그리드와 인스턴스 변수를 가지며 그리드는 여러 가지로 구성됩니다). JPanel s).특정 GUI 요소를 동적으로 대체합니다.

왼쪽에는 JList 명의 플레이어가 있고 오른쪽에는 그리드가 표시됩니다. 목록에서 플레이어의 이름을 클릭하면 동적으로 표를 변경하는 방법이 있습니까?

(플레이어가 선택 될 때마다 그리드를 업데이트하려고 시도했으나 플레이어가 선택한 후 그리드를 업데이트하면 해시가 업데이트되어 그리드를 업데이트해야합니다. 포커스 등 그래서 깨끗한 방법을 찾고)

EDIT : 또한, 나는 동적으로 개체의 참조를 변경하고 UI를 업데이 트하는 줄 알았지 만, 내가 최종 변수를 만들 수있는 몇 가지 액션 이벤트가 있습니다. 그래서 나는 이런 식으로 할 수 없습니다.

답변

3

선택이 변경되면 표를 변경하지 마십시오. 그리드에 표시된 데이터 (그리드의 데이터 모델)를 변경해야합니다. 예를 들어, 격자가 String[][]의 한 요소를 표시하는 9 개의 레이블을 포함하는 패널이라고 가정합니다. Grid 개체는 그리드의 각 레이블 값을 변경하는 setModel(String[][] data)이어야합니다.

플레이어 선택이 변경 될 때마다 선택한 플레이어에게 데이터를 요청하고 setData()을 그리드에서 호출해야합니다. 플레이어의 데이터가 변경되는 동안 변경 될 수 있으면 변경 될 때마다 setData()를 호출해야합니다. 이는 데이터가 변경 될 때 Player에 의해 트리거 된 PropertyChangeEvent과 이벤트를 트리거하는 플레이어가 선택된 플레이어 인 경우 새로운 데이터로 그리드를 업데이트하는 수신기를 갖춤으로써 수행 될 수 있습니다.

+0

아마도 이것이 for 루프를 필요로 할 것이라고 생각합니까? 이 경우 다른 플레이어의 그리드를 "보여주는"다른 방법보다 효율적이지는 않습니까? – Cemre

+2

성능 문제가 발생하기 전에 성능에 신경 쓰지 마십시오. 1 밀리 초 동안 반복 할 수있는 반복 횟수를 알고 있습니까? GUI에서 구성 요소를 변경할 때마다 얼마나 많은 작업이 수행되는지 알고 있습니까? 나는 다른 솔루션을 보여줄 필요가 없기 때문에 내 솔루션이 더 효율적이라고 확신합니다. 그러나 그것은 중요하지 않습니다. 중요한 것은 충분히 빠르다는 것입니다. –

1

기본적으로 선택한 플레이어가 표시되는 그리드를 결정하는 플레이어 목록이 있습니다. 눈금이 포함 된 패널에 CardLayout을 사용하는 경우 선택 사항이 업데이트되면 특정 플레이어에 해당하는 눈금을 표시하도록 패널에 요청할 수 있습니다.

for -loops가 필요하지 않지만 CardLayout#show 메소드를 호출하면됩니다.

된 전체 tutorial 당신은 CardLayout 및 스왑 적절한 카드 (9 개) 패널을 배치 할 수 있습니다 CardLayouts

3

작업에 대한 정보를 볼 수 있습니다. 또는 이전 구성 요소를 제거하고 새 구성 요소를 추가 한 다음 추가 후 revalidate()repaint()을 호출 할 수 있습니다.

1

Concurrency in Swing을 얻으려면 이벤트 디스패치 스레드에 대한 작업을 예약해야합니다. 그래야 UI에 발생한 모든 변경 사항을 아무런 문제없이 표시 할 수 있습니다. 이 같은

뭔가 : 당신이 당신의 변경으로

public static void main(String... args) 
{ 
    // Used to schedule a job for event-dispatcher thread 
    SwingUtilites.invokeLater(new RUnnable() 
    { 
    public void run() 
    { 
     // put your code for creating and displaying the GUI here. 
     // or call the method which is creating and displaying the GUI here. 
    } 
    } 
); 
} 

그래서, 단지) (방법의 유효성을 다시()를 사용하고 다시 칠. 그게 당신이 성취하려고하는 것입니다. 도움이 될 수 있기를 바랍니다.

감사합니다.