2016-09-04 4 views
0

사용자가 사용할 아이템을 선택할 수있는 곳을 만들고 싶습니다.이 플레이어는 미니 크래프트와 비슷하지만 그 게임에 어떤 종류의 위젯이 사용되는지 모르겠습니다. 내가 한 일은 몇 개의 버튼을 만들어 테이블에 추가하여 정렬되도록하는 것입니다. 그러나 버튼의 문제점은 항목을 선택했는지 알 수있는 방법이 없다는 것입니다. 클릭 한 후에 원래 모양으로 이동하기 때문입니다. 나를 위해Mincraft와 같은 Libgdx Scene2d 버튼

btnCube = new TextButton("Cube", btnStyle); 

     btnCube.addListener(new ClickListener(){ 
      @Override 
      public void touchUp(InputEvent event, float x, float y, int pointer, int button) { 
       WorldController.element = "cube"; 
       super.touchUp(event, x, y, pointer, button); 
      } 
     }); 

난 그냥 화면에 플레이어를 클릭하면 해당 객체를 생성합니다 때 한 후, 그 일을 더 나은 방법이 특정 텍스트 문자열을 설정? 때문에 항목을 선택하는 문자열에 의존하는 것이 적절하지 않다고 생각하기 때문입니다. 이것은 당신이 선택되어 있기 때문에 빨간색 항목이 강조 표시되고 나머지는하지 않습니다 볼 수 있듯이 내가 얘기 한 것입니다

enter image description here

.

+1

ClickListener 대신 ChangeListener를 사용하십시오. 체크 된 Drawable이있는 버튼 스타일을 사용하여 버튼을 토글합니다. – Tenfour04

+0

나는 당신이 말한대로했지만 문제는 이제 다른 버튼을 클릭했을 때 버튼을 클릭하여 비활성화하고 다시 클릭하면 비활성화되는 버튼을 자동 비활성화하는 방법입니다. changeListener 안에 무엇을 넣어야합니까? –

답변

1

모든 단추에 동일한 변경 수신기를 지정하십시오. 단추를 전환하면 해당 단추가 changed 메서드가 호출됩니다. 그러나 버튼을 클릭하여 버튼을 켜기에서 끄기로 전환하지 않으려면 모든 버튼에 수동으로 변경 사항을 적용해야합니다. 먼저 전체 버튼 그룹을 하나의 세트에 넣으십시오.

그러면 changed이 호출 될 때 방금 눌러 진 버튼을 알 수 있으므로 모든 상태를 적절한 상태로 변경할 수 있습니다.

private ObjectSet<Button> toolButtons = new ObjectSet(); //put all buttons into this 

//add this same listener to all buttons. 
ChangeListener commonListener = new ChangeListener(){ 
    public void changed (ChangeEvent event, Actor actor){ 
     for (Button button : toolButtons){ 
      button.setChecked(button == actor); 
     } 
     setSelectedTool((Button)actor); 
    } 
}; 

void setSelectedTool(Button button){ 
    //however you are tracking the selected tool, you can apply the change 
    //here based on which button was pressed 
} 

//Also need to set programmatic change events false on all buttons to prevent stack overflow 
for (Button button : toolButtons) 
    button.setProgrammaticChangeEvents(false); 

어떤 도구가 선택되어 있는지 추적하려면 문자열을 사용하는 것 같습니다. 문자열을 사용하고 있기 때문에 문자열 값을 사용하여 편리하게 버튼의 이름을 지정한 다음 setSelectedTool 메서드에서 사용할 수 있습니다. 예 :

btnCube = new TextButton("Cube", btnStyle); 
btnCube.setName("cube"); 
btnCube.addListener(commonListener); 
toolButtons.add(btnCube); 

//... 
void setSelectedTool(Button button){ 
    WorldController.element = button.getName(); 
} 

그러나 문자열은이를 추적하는 강력한 방법이 아닙니다. 정말 열거 형을 사용해야합니다. 열거 형을 사용하는 경우 버튼의 사용자 객체에 저장할 수 있습니다.

btnCube = new TextButton("Cube", btnStyle); 
btnCube.setUserObject(ElementType.CUBE); //example enum you need to create 
btnCube.addListener(commonListener); 
toolButtons.add(btnCube); 

//... 
void setSelectedTool(Button button){ 
    WorldController.element = (ElementType)button.getUserObject(); 
} 
관련 문제