2016-11-02 3 views
0

저는 JavaFX를 사용하여 UI를 생성하는 Java 프로젝트를 가지고 있습니다. 저는 자바 프로그래머가 아닙니다 (일반적으로 프로그래머가 많지 않습니다 - 저는 CS 학생입니다). 그래서 약간의 학습 경험이 있지만, 일반적으로 제가가는 것처럼 제 자신의 질문에 대답하고 있습니다. 지금은 TableView로 끈적한 지점을 치고 있지만 조금 잃어 버렸습니다. 특히, TableView와의 상호 작용에 대한 응답으로 어떤 종류의 작업도 설정할 수 없습니다.FXML에서 TableView onMousePressed 액션 정의하기

내 프로젝트의 현재 레이아웃은 Main.java, Controller.java 및 UI.fxml입니다. Main에서 창/씬은 프로그램이 시작될 때 UI.fxml에서로드됩니다. (기술적으로는 프로젝트 코드의 다른 여러 비트를 포함하고 있지만, 나는 단지 관련이 무엇을 게시 할 노력하고있어.) 나는있는 TableView 너무로 UI.fxml에서 정의한 :

<TableView fx:id="queueTable"> 
    <columns> 
     <TableColumn text="Title"> 
      <cellValueFactory> 
       <PropertyValueFactory property="tableTitle"/> 
      </cellValueFactory> 
     </TableColumn> 
     <TableColumn text="Artist"> 
      <cellValueFactory> 
       <PropertyValueFactory property="tableArtist"/> 
      </cellValueFactory> 
     </TableColumn> 
     <TableColumn text="Album"> 
     <cellValueFactory> 
       <PropertyValueFactory property="tableAlbum"/> 
      </cellValueFactory> 
     </TableColumn> 
    </columns> 
</TableView> 

은 마찬가지로 내가 UI에 정의 된 여러 가지 버튼이 그래서으로의 OnAction와 .fxml :

<Button fx:id="buttonQueueAdd" text="Add" onAction="#addMediaToQueue"/> 

를 내 앞의 코드에서 나는 내있는 TableView이 생성되는 방법에서의 TableView의 항목이 선택되었을 때의 이벤트를 정의 할 수 있었다. 그러나 이제 모든 UI 작성은 FXML 파일을 통해 수행됩니다. FXML 파일에는 Controller 클래스가 있는데 (Controller.java), 모든 액션은 다양한 버튼에 대해 정의되어 있지만 FXML에서는 onAction, setOnMousePressed 등과 같은 속성을 허용하지 않습니다. 파일에 대한 'onAction'속성을 허용하는 것처럼 TableView에 대한 것입니다.

메인 클래스에서 액션을 정의하거나 (장면이 생성 될 때 메인 클래스에서 호출되는 컨트롤러 클래스에 메소드를 생성하는 방법으로) 액션을 정의 할 수있는 것처럼 보입니다. 예를 들어, 더 이상 TableView에 항목을 추가 할 수 없거나 UI가 새로 추가되지 않아 항목이 추가되었다는 것을 나타낼 수 있습니다.

FXML에서 만든 TableView가 없기 때문에 대신 TableView를 만들고 모든 onMousePressed 이벤트 등을 FXML 파일 외부에서 설정하고 내 장면에 추가하도록하는 것이 가장 좋은 해결책 인 것 같습니다. Main 클래스의 start 메소드. 이것이 이전에 행해졌 던 방법이었고, 그때 받아 들일만큼 잘 작동했습니다. 그러나, 그것은 지저분 해 보입니다, 그리고 여러 개의 클래스 및/또는 FXML 파일에 걸쳐 흩어져있는 UI 요소로 이어집니다 - 이것은 여러 다른 학생들과 함께 작업하고있는 프로젝트이며 모든 것을 유선형/조직화 된 상태로 유지하려고합니다. 가능한 한. 나는 총알을 물고 그것을 "지저분한"방식으로해야합니까, 아니면 더 좋은 선택이 있습니까?

답변

0

fxml을 사용하여 여전히 TableView을 생성 할 수 있지만 컨트롤러에 initialize 메서드를 추가하십시오.

@FXML 
private void initialize() { 
    queueTable.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> { 
     ... 
    }); 
} 

을 경우이 리스너를 추가해야합니다 :이 객체 stucture를 만드는 끝낼 당신이 fxml에서 할 수없는 오브젝트 구조 변경을 할 수 있습니다 후이 방법은 FXMLLoader에 의해 호출 Main에서 컨트롤러에 메소드를 추가하고 fxml을 생성하는 데 사용하는 FXMLLoader 인스턴스에서 컨트롤러를 가져올 수 있습니다.

컨트롤러

public void addSelectedIndexListener(ChangeListener<? super Number> listener) { 
    queueTable.getSelectionModel().selectedIndexProperty().addListener(listener); 
} 

홈페이지

속성 속성은 선택 모델의 특성에 의존한다이다
FXMLLoader loader = new FXMLLoader(fxmlUrl); 
myNode = loader.load(); 
Controller controller = loader.getController(); 
controller.addSelectedIndexListener((observable, oldValue, newValue) -> { 
    ... 
}); 

주, 당신은 expression binding를 사용할 수 있습니다 원하는 효과를 얻을 수 있습니다. table.selectionModel.selectedIndex+0<0 부분은 자바 FX는 현재 null - 안전 평등 검사를 (table.selectionModel.selectedItem==null가 작동하지 않습니다)를 사용하지 않고 비교를 위해 0 일정한 권리의 종류를 얻을 수 없기 때문에, 사용되는 해결 방법입니다

<BorderPane xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1"> 
    <center> 
     <TableView fx:id="table" BorderPane.alignment="CENTER"> 
      <columns> 
       <TableColumn text="value"> 
        <cellValueFactory> 
         <PropertyValueFactory property="value"/> 
        </cellValueFactory> 
       </TableColumn> 
      </columns> 
      <items> 
       <FXCollections fx:factory="observableArrayList"> 
        <Item value="Hello World"/> 
        <Item value="42"/> 
       </FXCollections> 
      </items> 
     </TableView> 
    </center> 
    <left> 
     <Button mnemonicParsing="false" text="Remove" BorderPane.alignment="CENTER" disable="${table.selectionModel.selectedIndex+0&lt;0}" /> 
    </left> 
</BorderPane> 

주 (table.selectionModel.selectedIndex<0), 이것은 현재 좋은 옵션처럼 보이지 않습니다.

관련 문제