2017-10-10 1 views
0

교육 목적으로 javafx 어플리케이션에 단축키를 추가하려고합니다. 샘플 코드를 사용하여 핫키를 통해 내 레이블에 액세스 할 수 없습니다. 버튼을 사용하여 레이블을 성공적으로 업데이트하는 것과 동일한 메소드를 호출 할 수 있습니다.단축키로 라벨을 업데이트 할 때 Javafx NPE

보기 :

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane id="AnchorPane" prefHeight="62.0" prefWidth="91.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fx.probleme.SampleViewController"> 
    <children> 
     <Label id="label" fx:id="label" layoutX="14.0" layoutY="45.0" text="Label" /> 
     <Button layoutX="20.0" layoutY="14.0" mnemonicParsing="false" onAction="#updateText" text="Button" /> 
    </children> 
</AnchorPane> 

그리고 컨트롤러 :이 단계에서 Label가 초기화되지 않기 때문에

package fx.probleme; 

import javafx.application.Application; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.stage.Stage; 

public class SampleViewController extends Application { 

    @FXML 
    Label label; 

    @FXML 
    void updateText() { 
     label.setText(label.getText() + "+"); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent parent = FXMLLoader.load(this.getClass().getResource("SampleView.fxml")); 
     Scene scene = new Scene(parent); 
     scene.setOnKeyPressed((final KeyEvent keyEvent) -> { 
      if (keyEvent.getCode() == KeyCode.NUMPAD0) { 
       updateText(); 
      } 
     }); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

답변

0

당신은 NullPointerException를 얻을 수는, 초기화는 initialize에서 이루어집니다. 먼저 컨트롤러 클래스와 메인 클래스를 섞은 다음 컨트롤러를 implements Initializable으로 설정 한 후 컨트롤러를 initialize 메서드로 설정하면 구성 요소의 모든 메서드를 호출 할 수 있습니다. 그 이유는 모든 구성 요소에 주석이 달려 있기 때문입니다 @FXML에 의해 초기화됩니다. 귀하의 경우, 시작 메서드가 아직 초기화되지 않았습니다. 또한 장면의 메서드를 사용하지 않으려는 경우에 콘텐츠 팬에 이벤트, 동작을 추가 할 수 있습니다.

주 클래스에서 컨트롤러 클래스를 분리하고 Initializable을 구현하는 것이 좋습니다. 이것은 응용 프로그램에 대한 더 나은 비전을 가질 수있게 도와줍니다. NPE가 없으면 구성 요소가 초기화되는 위치를 정확히 볼 수 있고, 메서드를 사용할 수 있는지 확인할 수 있습니다.

당신은 당신은 당신이 버튼처럼 다음 onKeyPressed에 방법을 추가 할 수 있으며, .fxml 파일에 AnchorPane에 대한 fx:id을 추가 할 수 있습니다 (권장) 별도의 클래스에서 그것을하지 않으려면.

+0

답변 해 주셔서 감사합니다. javafx를 직접 가르치고 있으며,'Application' 클래스가'Controller' 클래스가되어서는 안된다는 것을 배웠습니다. 전 주 화면에서 onKeyPressed 이벤트를 사용하여 팁을 얻으십시오. 내용 창도 유효하지만, 여전히 올바른 방법으로'Controller'와'Application'을 분리 할 것입니다. 다른 독자 : 나는 왜 그들을 분리해야하는지에 대한 훌륭한 설명을 발견했습니다 : https://stackoverflow.com/questions/33303167/javafx-can-application-class-be-the-controller-class –

관련 문제