2017-01-12 4 views
1

FXMLを使用しないで、関連する質問がありましたが、MenuItemには、シーンを取得するためにキャストできるスーパークラスがありません。ボタンインスタンスで同じ問題が発生したときは、以下のアプローチを使用します。menuItemからソースシーンを取得する

(Scene) ((Node) event.getSource()).getScene(); 

私はこの問題を解決するためのアイデアを最も高く評価します。ここ

事前

で おかげで、ウィンドウのビュー

/** 
* @author Jose Gonzalez 
* 
*/ 
public class Transaction extends TempletePattern{ 
    private ImageView viewImage; 
    private Button button; 
    private TransactionController controller; 
    private TableView<Saving> table; 
    private TableColumn dateColum; 
    private TableColumn descriptionColum; 
    private TableColumn amountColum; 
    private TableColumn valanceColum; 
    /** 
    * 
    * @param controller 
    */ 
    public Transaction(TransactionController controller) 
    { 
    this.controller = controller; 

    } 

/** 
* main method all private methods in the class and set them up on the  borderpane 
* @return pane fully setup to be mount on the scene 
*/ 
public BorderPane setScreen() 
{ 

    BorderPane trans = new BorderPane(); 
    trans.setStyle("-fx-background: #FFFFFF;"); 
    VBox topBox = new VBox(); 
    topBox.getChildren().addAll(setMenu(),setTop()); 
    trans.setTop(topBox); 
    trans.setBottom(processUpdate(process)); 
    trans.setCenter(setCenter()); 


    return trans; 
} 
/** 
* 
* @return vbox holding all note pertaining to the center of the borderpane 
*/ 
private VBox setCenter() 
{ 

    VBox center = new VBox(); 
    center.setPadding(new Insets(30, 20, 20, 20)); 
    table = new TableView<>(); 
    table.setEditable(true); 

    dateColum = new TableColumn("Date"); 
    dateColum.setCellValueFactory(new PropertyValueFactory<>("firstName")); 
    dateColum.prefWidthProperty().bind(table.widthProperty().divide(4)); 
    dateColum.setResizable(false); 

    descriptionColum = new TableColumn("Description"); 
    descriptionColum.prefWidthProperty().bind(table.widthProperty().divide(4)); 
    descriptionColum.setResizable(false); 
    descriptionColum.setCellValueFactory(new PropertyValueFactory<>("lastName")); 

    amountColum = new TableColumn("Amount"); 
    amountColum.prefWidthProperty().bind(table.widthProperty().divide(4)); 
    amountColum.setResizable(false); 
    amountColum.setCellValueFactory(new PropertyValueFactory<>("transaction")); 

    valanceColum = new TableColumn("Availble Valance"); 
    valanceColum.prefWidthProperty().bind(table.widthProperty().divide(4)); 
    valanceColum.setResizable(false); 
    valanceColum.setCellValueFactory(new PropertyValueFactory<>("valance")); 

    table.getColumns().addAll(dateColum, descriptionColum, amountColum,valanceColum); 
    mockInfo(); 
    center.getChildren().add(table); 

    return center; 
} 

/** 
* 
* @return the screen's menu fully set up 
*/ 
private MenuBar setMenu() 
{ 

    MenuBar menubar = new MenuBar(); 
    final Menu UserMenu = new Menu("User"); 
    UserMenu.setId("user"); 
    UserMenu.setOnAction(controller); 
    MenuItem itemLog = new MenuItem("log out"); 
    itemLog.setId("logout"); 
    itemLog.setOnAction(controller); 
    MenuItem itemAcount = new MenuItem("new acount"); 
    itemAcount.setId("newAccount"); 
    UserMenu.getItems().addAll(itemLog, itemAcount); 

    final Menu acctMenu = new Menu("Accounts"); 
    MenuItem itemsavis = new MenuItem("Savings"); 
    MenuItem itemCredit = new MenuItem("Credit"); 
    MenuItem itemChecking = new MenuItem("Checking"); 
    acctMenu.getItems().addAll(itemsavis, itemCredit, itemChecking); 


    final Menu aboutMenu = new Menu("about"); 
    MenuItem itemHelp = new MenuItem("Help"); 
    aboutMenu.getItems().addAll(itemHelp); 


    menubar.getMenus().addAll(UserMenu, acctMenu, aboutMenu); 

    return menubar; 
} 

/** 
* @param receive constumer info from model through controller and set it on table. 
*/ 
public void tableDataSetter(ObservableList<Saving> costumerInfo) 
{ 
    table.setItems(costumerInfo); 
} 

/** 
* insert mock data to be displayed as a place holder 
*/ 
private void mockInfo() 
{ 

    ObservableList<Saving> data = 
      FXCollections.observableArrayList(
        new Saving("11/10/16", "Deposit", 123, "123"), 
        new Saving("11/11/16", "Withdraw", 5, "123"), 
        new Saving("11/12/16", "Deposit", 24, "123"), 
        new Saving("11/13/16", "Withdraw", 62, "123"), 
        new Saving("11/14/16", "Deposit", 134, "123"), 
        new Saving("11/15/16", "Deposit", 134, "123"), 
        new Saving("11/10/16", "Withdraw", 123, "123"), 
        new Saving("11/11/16", "Deposit", 5, "123"), 
        new Saving("11/12/16", "Withdraw", 24, "123"), 
        new Saving("11/13/16", "Deposit", 62, "123"), 
        new Saving("11/14/16", "Withdraw", 134, "123"), 
        new Saving("11/15/16", "Deposit", 134, "123") 
        ); 

    table.setItems( data ); 
} 



} 

であり、ここでコントローラです。 ps私はちょうどそれに取り組み始めた。

public class TransactionController implements EventHandler{ 


    //private LoginModel model ; 
    private Transaction view; 


    public TransactionController() 
    { 
    // model = new LoginModel(); 
     view = new Transaction(this); 
    } 

    @Override 
    public void handle(Event event) { 

     if(( event.getSource() instanceof MenuItem)) 
     { 
      System.out.println("afe " + (((Object)event.getTarget())) ); 
      if( ((MenuItem) (event.getSource()) ).getId().equals("logout") ) 
      { 

       System.err.println("from inside logout"); 
      /// this.goTologInt(event); 
      }else if(((MenuItem) (event.getSource()) ).getId().equals("newAccount") ) 
      { 
      // this.goToNewAct(event); 

      } 


     } 

    } 

    private void goToNewAct(Event event) 
    { 
     Scene scene = (Scene) ((Control) event.getSource()).getScene(); 
    // Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); 
     NewCustomerView newAcct = new NewCustomerView(); 
     scene.setRoot(newAcct.newCustomerScreen()); 
    } 


    private void goTologInt(Event event) 
    { 
     Scene scene = (Scene) ((Node)event.getSource()).getScene() ; 
     //Scene scene = (Scene) ((Control) event.getSource()).getScene(); 
     // Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); 
     LoginView newAcct = new LoginView(new LoginController()); 
     scene.setRoot(newAcct.loginScreen()); 
    } 

} 
+0

contのメニュー項目にハンドラーを追加するシナリオは想像もつきませんあなたがシーンを取得することができない場所、またはシーン内の少なくとも1つのノードを合理的に簡単に見つけることができます。このためのコンテキストを教えてください。シーンから*イベントだけを取得する必要がある理由を示す[MCVE]? –

+0

私のアプリケーションでは、ユーザーに新しいアカウントを追加できるようにしたいと考えています。新しいステージやシーンを作成せずに、別のスクリーン/ペインにユーザーを誘導する計画です。 –

+1

それは私の質問にも答えません。ハンドラを登録するコードでは、シーンまたはシーン内の何かへの参照を取得できる必要があります。あなたはあなたの質問を編集し、問題を示すのに十分な文脈で*コードを掲示できますか? –

答えて

0

あなたはポップアップとメニューが表示されるまで、メニュー階層を上がると、コンテキストメニューから開かれたウィンドウで、このポップアップのオーナーウィンドウを得ることができます。

単に MenuItemEventHandlerに利用できる問題のシーンについての情報を作成するのに、私はそれより良いアイデアを検討したい。一般に
@Override 
public void start(Stage primaryStage) { 
    MenuItem menuItem = new MenuItem("Something"); 
    Menu menuInner = new Menu("menu", null, menuItem); 
    Menu menuOuter = new Menu("menu", null, menuInner); 
    MenuBar menuBar = new MenuBar(menuOuter); 

    StackPane root = new StackPane(); 
    root.setAlignment(Pos.TOP_LEFT); 
    root.getChildren().add(menuBar); 

    Scene scene = new Scene(root); 

    menuItem.setOnAction(evt -> { 
     MenuItem m = (MenuItem) evt.getSource(); 
     while (m.getParentPopup() == null) { 
      m = m.getParentMenu(); 
     } 

     Scene s = m.getParentPopup().getOwnerWindow().getScene(); 
     System.out.println(s == scene); 
    }); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

final Scene scene = ... 

menuItem.setOnAction(evt -> { 
    // do something with scene 
}); 

の代替finalローカル変数はフィールドを使用しています...

+0

ありがとう、あなたの答えは確かにFabianです。私は数回メニュー階層を上げようとしましたが、私のアプローチは間違っていました。私は意図的にその場面を渡っていない。私はカップリングの問題を避けるために、あるいは単にプログラムがシーンを通過することなく実行できるかどうかを見たいだけです。 –

関連する問題