2016-12-08 14 views
0

これは以前stackoverflowで質問されていましたが、私の問題の解決策を見つけることができませんでした。 いくつかのコードをButtonClickイベントから分離する必要があります。ここでは、ButtonClickでノードを動的に作成し、それを親AnchorPaneに追加します。私のノードはボタンですが、これらのボタンのイベントはCommandPatternで処理されます。作成したノードに応じて、別のButtonEventを作成します。文字列からクラスを作成してコマンドパターンを使用する

これまで正常に動作コードは次のとおりです。

@FXML 
void addErosionNode(ActionEvent event){ 
    DragNode nde = new DragNode(); 
    /* 
    id = nde.getId(); 
    name = new String("Erosion"); 
    Erosion cmd; 
    cmd = new Erosion(); 
    nodeList.add(new NodeList<String, String, Command>(name, id, cmd)); 
    */ 
    setupNode(nde); 
    nde.setNodeWithTwoCircles(); 
} 

しかし、私は** /別のメソッド内/間のコードを置きたいので、私はsetupNode(nde, name);

でコードを交換して試すことができますこの方法を使用する:

public void setupNode(DragNode nde, String name){ 

       id = nde.getId(); 
       Class clazz; 
       className = new String ("application.bvfunc." + type); 
       //This will be e.g. application.bvfunc.Erosion which is the class I want to use 
       try { 
        clazz = Class.forName(className); 
       } catch (ClassNotFoundException e) { 
        System.out.println("fail"); 
       } 
       clazz cmd; 
       cmd = new clazz(); 
       nodeList.add(new NodeList<String, String, Command>(name, id, cmd)); 

       nde.nodeLayout(); 
       rightAnchor.getChildren().add(nde); 
       buildDragHandlers(); 
    } 

ただし、clazzはタイプに解決できません。

は、どのように私は私のノードの名前で作成clazz

Erosion cmd; 
cmd = new Erosion(); 

を置き換えることができますか?

clazz cmd; 
cmd = new clazz(); 
+0

あなたは(http://stackoverflow.com/questions/6094575/creating-an-instance-using-the-class-name-and-calling [この]を試してくださいました-コンストラクタ)? – 31piy

+0

はい、うまくいきません – Flippy

答えて

0

clazz cmd; 
cmd = new clazz(); 

を置き換えます:

このよう
private static final Map<String, Supplier<Command>> commandMap = new HashMap<>(); 

static { 
    commandMap.put("Erosion", Erosion::new); 
    commandMap.put("Dilation", Dilation::new); 
} 

は、その後、あなたの他のコードに:

public void setupNode(DragNode nde, String name){ 
    id = nde.getId(); 
    Command cmd = commandMap.get(name).get(); // <-- Calls the constructor    
    nodeList.add(new NodeList<String, String, Command>(name, id, cmd)); 

    nde.nodeLayout(); 
    rightAnchor.getChildren().add(nde); 
    buildDragHandlers(); 
} 
+0

これは私にとってうまくいきます、ありがとう! – Flippy

0

代わりにリフレクションを使用してのあなたは、コンストラクタにそのコマンドの名前をマップするマップを作成することができ

Command cmd = (Command) clazz.newInstance(); 
+0

エロージョン、ダイレーションなどとは独立して使いたいです.DilatationはCommandPatternを含む別のクラスなので、Stringからエロージョン/膨張を使用する必要があります。私が 'Command'を使うと" ObjectからCommandに変換できない "というメッセージが表示される – Flippy

+0

@Flippy申し訳ありませんが、タイプキャストで答えを更新しました。 –

+0

@Dimitry T.未処理の例外タイプIllegalAccessExceptionを取得しました – Flippy

関連する問題