2017-06-05 13 views
0

JavaFxで単純なMVCアプリケーションを構築しようとしています。ボタンbを押すと、左のTextField(tf1)の値をとり、右のテキストフィールド(tf2)にコピーします。したがって、ボタンbをクリックしたときに何をすべきかを定義すると、eclipseにエラーは表示されませんが、ボタンを返す代わりにプログラムを実行すると、NullpointerExceptionがスローされます。JavaFx MVC GetterがNullPointerExceptionをスローする

私は何が間違っているのか考えていますか?

ありがとうございます!

Model.java:

package mvc; 

public class Model { 
private String firsttext; 
private String lasttext; 

public String getFirsttext() { 
    return firsttext; 
} 
public void setFirsttext(String firsttext) { 
    this.firsttext = firsttext; 
} 
public String getLasttext() { 
    return lasttext; 
} 
public void setLasttext(String lasttext) { 
    this.lasttext = lasttext; 
} 

} 

View.java:

package mvc; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.FlowPane; 
import javafx.stage.Stage; 

public class View extends Application { 
private TextField tf1; 
private TextField tf2; 
private Button b; 

@Override 
public void start(Stage stage) { 
    tf1 = new TextField(); 
    tf2 = new TextField(); 
    b = new Button("Copy"); 

    FlowPane fp = new FlowPane(); 
    fp.getChildren().addAll(tf1, b, tf2); 

    Scene scene = new Scene(fp, 600, 200); 
    stage.setScene(scene); 
    stage.show(); 
} 

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

public TextField getTf1() { 
    return tf1; 
} 

public void setTf1(TextField tf1) { 
    this.tf1 = tf1; 
} 

public TextField getTf2() { 
    return tf2; 
} 

public void setTf2(TextField tf2) { 
    this.tf2 = tf2; 
} 

public Button getB() { 
    return b; 
} 

public void setB(Button b) { 
    this.b = b; 
} 
} 

Controller.java:

package mvc; 

public class Controller { 
private View view; 
private Model model; 

public Controller(View v, Model m) { 
    view = v; 
    model = m; 
} 

public void initController() { 
    view.getB().setOnAction(evt -> { 
     model.setFirsttext(view.getTf1().getText()); 
     model.setLasttext(model.getFirsttext()); 

     view.getTf2().setText(model.getLasttext()); 
    }); 

} 
} 

App.java:

package mvc; 

public class App { 
public static void main(String[] args) { 
    Model m = new Model(); 
    View v = new View(); 
    Controller c = new Controller(v, m); 
    v.init(args); 
    c.initController(); 
} 
} 
+0

嘆願ここにスタックトレースを追加する –

+1

[この質問](https://stackoverflow.com/questions/33303167/javafx-can-application-class-be-the-controller-class)を見てください - それはまったく同じではありませんしかし答えは、 'Application'クラスの意図した使い方を説明しています。 'launch'を呼び出すと新しいインスタンスが作成されるので、あなたが見ているインスタンスはコントローラに渡すインスタンスではありません。 'App'クラスをアプリケーションに拡張し、静的コンテキストからのみ' launch'を呼び出すことが最善です。 – Itai

+0

stacktraceは次のとおりです。スレッドmainの例外java.lang.NullPointerException \t at mvc.Controller.initController(Controller.java:14) \t at mvc.App.main(App.java:9) – ILikeC0ding

答えて

0

sillyflyさんのコメントを見る私はコントローラに渡されなかった新しいインスタンスを作った。ここで

は修正されたファイルは、以下のとおりです。

Model.java - >、変更それに
Controller.javaを見るために上を見ていなかった - >変更されていない、それを見るために上を見てみましょう

View.java:

package mvc; 

import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.FlowPane; 

public class View { 
private TextField tf1; 
private TextField tf2; 
private Button b; 
private Scene scene; 

public View() { 
    tf1 = new TextField(); 
    tf2 = new TextField(); 
    b = new Button("Copy"); 

    FlowPane fp = new FlowPane(); 
    fp.getChildren().addAll(tf1, b, tf2); 

    scene = new Scene(fp, 600, 200); 
} 

public Scene getScene() { 
    return scene; 
} 

public void setScene(Scene scene) { 
    this.scene = scene; 
} 

public TextField getTf1() { 
    return tf1; 
} 

public void setTf1(TextField tf1) { 
    this.tf1 = tf1; 
} 

public TextField getTf2() { 
    return tf2; 
} 

public void setTf2(TextField tf2) { 
    this.tf2 = tf2; 
} 

public Button getB() { 
    return b; 
} 

public void setB(Button b) { 
    this.b = b; 
} 
} 

App.java:

package mvc; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class App extends Application { 
private Scene scene; 
private Model m = new Model(); 
private View v = new View(); 
Controller c = new Controller(v, m); 

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

@Override 
public void start(Stage stage) throws Exception { 
    scene = v.getScene(); 
    stage.setScene(scene); 
    stage.show(); 
    c.initController(); 
} 
} 
関連する問題