2014-11-26 2 views
4

"먹이감"을 감지하고 먹는 버그를 기반으로 그리드 스타일의 게임/시뮬레이션을 만들고 있습니다. 나는 gridPane (worldGrid)을 사용하여 버그와 음식 표를 보여주고있다. 이것은 버그가 세포를 음식쪽으로 이동시킬 때 끊임없이 업데이트 될 것입니다.JavaFX GridPane에서 (행, 열) 노드를 바꿉니다

저는 [row, col]의 레이블을 cellContent에 새 텍스트가있는 레이블로 바꾸려는 기능이 updateGrid(int col, int row, String cellContent)입니다. .

나는

worldGrid.add(new Label(cellContent), row,col); 

그러나 그건 그냥 현재 레이블의 상단에 라벨을 추가하고 시뮬레이션 분명 100 개 이상의 반복이 적합하지 이잖아 걱정 메신저 작동 후속 있습니다.

나는 레이블을 추가하기 전에이 작업을 시도하십시오 add 라인을하려고 할 때

worldGrid.getChildren().remove(row,col); 

그러나 나는 다음 IllegalArgumentException를 얻을.

방법에 대한 아이디어가 있으십니까? 아니면 텍스트 대신 스프라이트를 사용하게 될 끊임없이 변화하는 그리드를 가장 효과적으로 보여주는 방법에 대한 아이디어는 더 좋을까요?

답변

11

grid.add (node, col, row)에 의해 제공되는 col/row (주의 먼저 첫 번째 열이옵니다!)는 레이아웃 제약 사항입니다. 이것은 2 차원 배열의 슬롯과 같은 열이나 행에 액세스 할 수있는 방법을 제공하지 않습니다. 따라서 노드를 대체하려면 객체 자체를 알아야합니다. 별도의 배열로 기억하십시오.

은 그럼 당신은 getChildren를 호출 할 수 있습니다() (객체)를 제거 ... 예 :.

GridPane grid = new GridPane(); 

Label first = new Label("first"); 
Label second = new Label("second"); 

grid.add(first, 1, 1); 
grid.add(second, 2, 2); 
second.setOnMouseClicked(e -> { 
    grid.getChildren().remove(second); 
    grid.add(new Label("last"), 2, 2); 
}); 
box.getChildren().addAll(grid); 
+0

물론 remove (object)를 사용하면 자식 목록 전체에서 개체를 선형 검색해야하므로 거대한 그리드에서는 효율성이 떨어질 수 있습니다. (게임에 자유롭고 빠른 업데이트가 필요한 경우) –

+0

그리드에 둘 이상의 열이 있다면 (반드시 수행해야 함) 전체 행을 제거하고 새 노드로 다시 추가하고 동일하게 유지해야합니다. –

+0

Joe Almore는 절대 사실이 아닙니다. 예제와 같이 단일 노드를 제거한 다음 다른 노드를 추가 할 수 있습니다. – Xerus

1

나는 옌스 - 피터 동의하지만 난 당신이 얻을 GridPane의 getColumnIndex 및 getRowIndex를 사용할 수있는 추가합니다 특정 노드의 위치 예를 들어

(이 GridPane를 확장하는 구성 요소에) :이 경우, 즉

// set the appropriate label 
for (Node node : getChildren()) { 
    if (node instanceof Label 
    && getColumnIndex(node) == column 
    && getRowIndex(node) == row) { 
     ((Label)node).setTooltip(new Tooltip(tooltip)); 
    } 
} 

의 GridPane의 모든 노드를 통해 이동하고 원하는 조건의 일치 확인 행과 열.

0

당신은 getChildren(). remove() 메서드를 직접 호출하면 그리드 패널이 제약 조건과 동기화되지 않게됩니다. 추가하면 노드에 대한 제한 조건도 설정됩니다. clearConstraints() 메소드를 추가하십시오.

관련 문제