2016-10-16 4 views
3

실례합니다. 어리석은 것처럼 보일지 모르겠지만 궁금합니다. 자바에서 GUI를 가질 프로그램을 만들고 있는데, 속성에 대한 전체적인 생각이 궁금합니다. 클래스에 데이터를 추가 할 수있는 이유는 무엇입니까? 예를 들어 :왜 JavaFX 속성을 사용합니까?

class myButton extends Button { 

    private boolean booleanProperty = false; 

    myButton(args...) { 
     // Do something with the property 
    } 

    public void setProperty(boolean value) { 
     this.booleanProperty = value; 
    } 

    public boolean getProperty() { 
     return this.booleanProperty; 
    } 
} 

버튼의 사용자 정의 구현에 대한 추가 정보를 저장하기 위해 잘 작동하는 것 같다. 하지만 무엇에 대해 :

class myButton extends Button { 

    private SimpleBooleanProperty booleanProperty = new SimpleBooleanProperty(false); 

    myButton(args...) { 
     // Do something with the property 
    } 

    public void setProperty(boolean value) { 
     this.booleanProperty.set(value); 
    } 

    public boolean getProperty() { 
     return this.booleanProperty.get(); 
    } 
} 

유일한 차이는, 나는 (내가 틀렸다면 정정 해줘)보고하고는 속성 값에 수신기를 부착 할 수 있는지,하지만 더있을 경우 같은 느낌 그것보다. 아이디어?

+0

실제로 청취자를 연결하는 것이 유일한 차이점이지만 생각만큼 사소한 것은 아닙니다. –

+0

또한 객체 모델에서 UI에 구현을 그릴 때 반은 시간을 절약 할 수 있으므로 시간을 절약 할 수 있습니다. – Elltz

답변

4

JavaFX의 속성은 변경이 발생할 때 UI를 자동으로 업데이트하는 방식으로 바인딩 될 수 있다는 것입니다. 텍스트 입력란에 값이 포함되지 않는 경우 숨기려는 요소를 고려 예를 들어

: 당신이 tf에서 텍스트를 변경으로 이제

TextField tf = ... 
Node container = ... 
container.visibleProperty.bind(tf.textProperty.isNotEmpty()); 

, 당신은 전환 container을 볼 수의 존재 기반으로 볼 수 있는지 여부 본문.

0

미리 만들어진 객체가 나중에 사용할 수 있도록 임의의 값을 보유 할 수 있도록 javafx 속성을 사용합니다. 따라서 표시된 값에 직접 영향을주지 않는 텍스트 필드 나 다른 객체에 값을 설정할 수 있습니다.

3

그들은 실제로 UI가 아닌 관련 자료에서 사용하기 시작한 많은 방법으로 유용합니다. 그러나이 예를 살펴 : 당신은 UndoManager에 클래스를

public class UndoManager { 
    BooleanProperty canUndo = ...; 
    BooleanProperty canRedo = ...; 

    ... 
} 

을 habe 그리고 당신은 당신이 실행 취소/다시 실행을 호출 할 수있는 곳에서 3 곳이있다.

menuUndo.disabledProperty().bind(undoManager.undoProperty()): 
toolbarUndo.disabledProperty().bind(undoManager.undoProperty()); 
contextMenuUndo.disabledProperty().bind(undoManager.undoProperty()); 

당신은 이제까지 해달라고 다시에 대해 걱정할 필요가 :

MenuButton menuUndo; 
Button toolbarUndo; 
MenuButton contextMenuUndo; 

당신은 기본적으로 경우에만이 작업을 수행하는 beed. 실행 취소가 발생할 수있는 새 장소를 추가하는 경우이를 바인딩해야합니다.

3

이 경우 속성 개체 자체에 대한 액세스를 허용하지 않으므로 이점이 없습니다. 보통이 작업이 완료됩니다.

이 속성을 사용하면 속성에 청취자를 추가하고 변경할 때 알림을받을 수 있습니다.

바인딩은 값을 동일하게 유지하기 위해이 가능성을 사용하고 Bindings 클래스는 속성의 간단한 변환을위한 메서드를 제공합니다.

BooleanProperty booleanProperty = new SimpleBooleanProperty(); 
booleanProperty.addListener(new ChangeListener<Boolean>() { 

    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
     System.out.println("property changed form "+oldValue +" to "+newValue); 
    } 
}); 
booleanProperty.set(true); 
booleanProperty.set(true); 
booleanProperty.set(false); 
booleanProperty.set(false); 
booleanProperty.set(false); 
booleanProperty.set(true); 
booleanProperty.set(false); 
booleanProperty.set(true); 
booleanProperty.set(false); 

또한 속성을 나타내는 개체를 전달할 수 있습니다. 예 : booleanProperty을 쓰거나 읽어야하는 코드는 속성을 쓰거나 읽기 위해 myButton에 대한 정보가 필요하지 않습니다. 너는 재산을 그냥 지나칠 수있어.

TableView은 propertys를 사용하는 클래스의 예입니다. TableView과 함께 사용 된 열은 TableView의 항목에서 속성을 가져오고 TableView은 해당 속성에 대한 수신기를 등록합니다.이렇게하면 변경 내용이 코드의 다른 곳에서 실행 되더라도 셀에 표시된 값을 변경할 수 있습니다. 또한 편집 가능한 셀의 경우 항목의 속성을 자동으로 수정할 수 있습니다.

0

장애가있는 고객을 돌보는 로봇을 프로그래밍한다고 상상해보십시오. 재산 리스너와 같은 것을 사용하지 않고 돌보아 야 할 고객이나 다른 업무에 어떻게 대응할 것인가?

속성 수신기를 사용하면 프로그램이 Concurrent이 될 수 있다는 이점이 있습니다. 다음 1 시간에 오는 고객이 없으면 Sequentially 프로그램을 작성하고 다음 시간 동안 아무 것도하지 않습니다. 이 예에서 유연한 단어 Concurent을 바꾸는 것이 더 좋을 수도 있지만 Concurent programmingSequence programming을 찾아야합니다. 이러한 속성을 통해 프로그램을 사용자 정의 할 수 있습니다. concurent.

또한 사용중인 GUI가 동일한 원칙에 따라 내장 (이벤트 수신) 기능을 이미 사용하고 있다는 것을 알고 있어야합니다.

이제 한 번에 한 고객을 넘겨주는 대신 해당 로봇을 만들면 수행해야 할 작업에 따라 어떻게 대응할 수 있습니까? (고객이 먹었을 경우), 새로운 주문 (ANYBODY에 의해 요청되는 경우), 요리를 가져 오는 고객 (고객이 지불하고 테이블에 요리가있을 때), 지불 처리 (고객이 요청한 경우) 아무도). 그리고 resturant에 도착하는 새로운 고객을 처리하는 ofcours.

동시에 작성된 프로그램은 모든 고객이 필요로하는 모든 작업을 처리합니다. sequencly 만든 로봇은 한 번에 한 고객을 처리합니다. 어쩌면 고객에게 인사하고 자리에 앉히는 것만으로도 유용 할 수 있습니다. (각 고객 당 1 개의 로봇을 가질 수는 없습니다.)

순차적으로 프로그램하기가 쉽다고 생각하는 사람도 있습니다. 이것은 특정 순서로 수행되어야하는 하위 작업을 추적하는 것이 어려울 수 있음을 인정합니다. 예를 들어, 로봇이 손님을 찾지 못하면 요리를 찾지 않아야합니다. 접시를 들고있을 때 지불 통화를 받으면 어떻게됩니까? 따라서 다른 작업의 우선 순위를 지정하고 정리하는 것이 어렵습니다. 그러나 그것을 성공적으로 수행하면 프로그램이 훨씬 더 효과적이됩니다. 그것은 mutli 작업 대 vs 그냥 솔로 - 태스킹 수있을 것입니다.

그리고 속성의 유일한 목적은 실제로 리스너를 추가 할 수 있다는 것입니다.