スパゲッティ生産所

コードの走り書きとかメモとか日常のこととか

Nodeに任意の情報をのせて後から利用する話

ListView上には任意のNodeがのせられますが、右クリックしてあるActionを実行するときに、選択したNodeの情報を取得したい場合があ ります。その時にはset/getUserdata(Object)というメソッドを利用することでNodeに任意の情報を結びつけることができます。

public class StageController{
   
    @FXML
    private ListView<Label> testview;

    @FXML
    private void setData(Object obj){
        Label label = new Label();
        label.setText(obj.getText());
        label.setUserData(obj);
        testvew.getItems().add(label);
    }
  
    @FXML
    private void getData(){
        MultipleSelectionModel<Label> model = testview.getSelectionModel();
        Object object = (Object)model.getSelectedItem().getUserData();

    }
}


現在作っているTwitterのクライアントでは、Timeline上のTweetへの返信などに利用しています。
これを見つけるまではObjectを保持するArrayListを別に作っておいてIndexで情報を引き出す形にしていましたが、こっちだと ArrayListとListViewの内容がずれたりする心配がないのでこっちの方がいいと思います。

ListViewにFXMLで設計した部品を貼り付ける話

現在JavaFXを用いて作っているアプリケーション(Twitterのクライアント)で、ListViewにTimelineを表示させるために Paneを貼り付けることにした。このPaneは予めFXMLで設計することにしたが、PaneにFXMLをロードした後に情報をのせる方法がわからず 困っていたが、FXMLにgetControllerというメソッドがあるらしいので使ってみた。


public class MainStageController{
    @FXML
    ListView<AnchorPane> testview;

    public void setTest(Status status){
        AnchorPane pane = new AnchorPane();
        FXMLLoader loader = new FXMLLoader(getClass().getResource("TimelinePane.fxml"));
        try {
            pane = (AnchorPane)loader.load();
            TimelinePaneController controller = loader.getController();
            controller.setdata(status);
            testview.getItems().add(0,pane);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }   
}
public class TimelinePaneController {    
    @FXML
    Label ScreenName;
    @FXML
    Label text;
   
    void setdata(Status status){
        ScreenName.setText(status.getUser().getScreenName());
        text.setText(status.getText());
    }
}

このように書くことで、設計したPaneのControllerクラスのインスタンスを取得でき、Paneの情報を載せることができた。