2017-02-22 15 views
0

私は個人的なプロジェクトで初めてJavaFXで遊んでいます。外部のFXMLコントローラからタブへの参照を取得する

Tab(PieChartを追加)でコンテンツを更新できるようにしたいが、FXMLコントローラの外から、それが可能かどうか誰にでも教えてもらえますか?関連するタブへの参照はどのようにして取得できますか?追加するアイテムの場所を指定する方法はありますか?

更新:いくつかのコード例を追加しました。

インタフェース:

interface ChartStrategy { 

    public void DisplayChart(Info info) 
} 

2つの実装:

public class BarChartStrategy extends ChartStrategy { 

    public void DisplayChart(Info info) 
    { 
     // Create bar charts on specific tabs in the UI 
    } 
} 


public class PieChartStrategy extends ChartStrategy { 

    public void DisplayChart(Info info) 
    { 
     // Create pie charts on specific tabs in the UI 
    } 
} 

コンテキスト:

public class ChartContext { 
    private ChartStrategy strategy; 

    public void setChartStrategy(ChartStrategy strategy) { 
    this.strategy = strategy; 
    } 

    public void drawGraphs(Info info) { 
    strategy.DisplayChart(info); 
    } 
} 

ホープこれは私が何をしようとしているの明確なアイデアを提供します

私のコントロール私は、グラフを生成するためのデータが解析される、ユーザーが選択したファイルを読み込んでいます。

@FXML 
private void handleButtonAction(ActionEvent event) { 

    // Load the file and parse the data 
    ... 

    ChartContext charts = new ChartContext(); 
    charts.setChartStrategy(new PieChartStrategy()); 
} 

は、だから私の独創的な考えは、私は実装でDisplayChart関数からグラフを描くということでしたが、それは良い考えではありませんようです - 誰も私にこれを取得するための最良の方法で、ここでいくつかのアドバイスを与えることができます作業?

+2

なぜか尋ねることはできますか?これはまさにコントローラーがやろうとしているものです。特定のタブを返すコントローラ内のメソッドを定義し、必要な場所から呼び出すことができますが、UIコンポーネントをコントローラの外部に公開することはお勧めしません。 –

+0

私はストラテジの実装から直接UIにチャートを作成することで、ストラテジパターンを使用してUIのさまざまなチャートタイプの表示を処理しようとしていました。悪いアイデア?デザインパターンを授業に取り入れて、このパターンの周りに頭を浮かべます。 –

+0

悪い考えではありませんが、コントローラからUIコンポーネントを公開する必要はありません。コントローラーレベルで戦略を定義します。つまり、コントローラーには、そのタイプが戦略(インターフェース)であるフィールドへの参照があります。コントローラーのコンストラクターに渡されるストラテジー実装を指定して、コントローラーをFXMLではなくコードで作成します。次に、コントローラが戦略を呼び出し、適切なタブにチャートを配置できます。 –

答えて

1

これを少しリファクタリングします。

まず、ストラテジにグラフを表示させることは、少し柔軟性がありません。戦略には、最初にデータを視覚的に表現する方法(グラフを選択する方法)と実際にどこかに表示する方法を決定する2つの責任があります。それは単一責任の原則に違反します。

だから私はもちろん、実装のための

interface ChartStrategy { 

    public Chart generateChart(Info info) 
} 

と同様の操作を行います。戦略の責任は単にチャートを提供することです:コンテキストはそれをどうするかを決めることができます。

(あなたがここにもChartを返すことは、あまりにも剛性であるかどうかを検討することができます。多分あなたはちょうどそれがParent、またはNode返すようにしたいそして、あなたの「チャート」とは、例えば、例えば、TableViewである可能性があります。)

戦略パターンの理論的説明では、少なくとも私の解釈では、「コンテキスト」は単に「戦略を使用しているもの」を表しています。ですから、あなたのコンテキストは、MVCバリアントの選択に応じて、ビューまたはコントローラになる可能性があります。簡単な例として、あなたは

public class ChartTab { 

    private ChartStrategy chartGenerator ; 

    public void setChartGenerator(ChartStrategy chartGenerator) { 
     this.chartGenerator = chartGenerator ; 
    } 

    public Tab createChartTab(Info info) { 
     Tab tab = new Tab(); 
     tab.setContent(chartGenerator.generateChart(info)); 
     return tab ; 
    } 
} 

のようなものがあるかもしれませんし、その後、あなたのコントローラ

@FXML 
private TabPane tabPane ; 

@FXML 
private void handleButtonAction(ActionEvent event) { 

    // Load the file and parse the data 
    ... 

    ChartTab chartTab = new ChartTab(); 
    chartTab.setChartGenerator(new PieChartStrategy()); 
    tabPane.getTabs().add(chartTab.getTab(info));  
} 

にそれはあなただけで1種類を作成している固定コントローラの場合は、単にコントローラコンテキスト(検討することも可能ですあなたはFXMLファイルとそれに対応するコントローラを分割方法によって異なりチャート、)の:

public class MyController { 

    private ChartStrategy chartGenerator ; 

    @FXML 
    private TabPane tabPane ; 

    public MyController(ChartStrategy chartGenerator) { 
     this.chartGenerator = chartGenerator ; 
    } 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 

     // Load the file and parse the data 
     ... 

     Tab tab = new Tab(); 
     tab.setContent(chartGenerator.generateChart(info)); 
     tabPane.getTabs().add(tab);  
    } 

} 

このコントローラは、引数なしのコンストラクタを持たないノート、そうよFXMLファイルでfx:controller属性を使用することはできません。その属性をFXMLファイルから削除します)。代わりに、あなたは

FXMLLoader loader = new FXMLLoader("/path/to/DataDisplay.fxml"); 
MyController controller = new MyController(new PieChartStrategy()); 
loader.setController(controller); 
Parent root = loader.load(); 

は今、あなたはグラフを生成し、タブ・ペイン(または何でも)でそれらを表示する機能を持つFXMLとコントローラを持っているんだろうが、生成されたチャートの種類の詳細が織り込まれプラグイン可能な戦略に転換する。 MVC(またはMVPなど)のカプセル化がまだありますが、UIの詳細はView Controller(ここでは本当にプレゼンターですが、誰が数えていますか...)のペアで保持されます。言い換えれば、この戦略は残りのビューについては何も知らない。

+0

おかげで@James_D、これは私に考えのための食糧をたくさん与える。 –