I have a BorderPane, onto which I placed a MenuBar. At the center of the BorderPane I display differnt AnchorPanes depending on the MenuItem selected. So far so good.

Now, how do I make sure that the Menus change behavior in response to the item selected in the child AnchorPane? So for example if the user selects "Edit", there will be a different action depending on whether the item currently higlighted is a user account, a file etc.

So far I made something along these lines:

The BorderPane controller:

public class MenuTest implements Initializable{
@FXML
private BorderPane borderPaneMain;
@FXML
private AnchorPane anchorPaneMain;
@FXML
private Menu menuEdit;
@FXML
private MenuItem itemEdit;

static String menuMode;
static String entityName;

public MenuTest(){
    menuMode ="";
    entityName = "";
}

@Override
public void initialize(URL arg0, ResourceBundle arg1) {
    AnchorPane anchor;
    try {
        anchor = (AnchorPane) new FXMLLoader().load(getClass().getResource("views/MainView.fxml"));
        borderPaneMain.setCenter(anchor);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

protected static void setMenuMode(String menuMd, String entityNm){
    entityName = entityNm;
    menuMode = menuMd;
}

@FXML
private void onEditClick(){
    if(entityName.equals(AnchorTest.FILE)){
        //Launches correct edit view
        new FXMLLoader().load(getClass().getResource("views/EditFile.fxml"));
        //Passes the name of the entity so that the controller can retrieve its data
        FileEditController.setFile(entityName);
    }else if(entityName.equals(AnchorTest.PERSON)){
        new FXMLLoader().load(getClass().getResource("views/EditPerson.fxml"));
        PersonEditController.setFile(entityName);
    }                   
}
} 

The child AnchorPane controller:

public class AnchorTest implements Initializable{

public static final String PERSON = "PERSON";
public static final String FILE = "FILE";

ObservableList<String> peopleList;
ObservableList<String> fileList;

@FXML
private ListView<String> listPeople;
@FXML
private ListView<String> listFiles;

@Override
public void initialize(URL location, ResourceBundle resources) {
    peopleList = FXCollections.observableArrayList("Frank","Matin","Anne");
    fileList = FXCollections.observableArrayList("hello.txt","holiday.jpg","cv.doc");
    listPeople.setItems(peopleList);
    listFiles.setItems(fileList);
}

@FXML
private void personSelected(){
    MenuTest.setMenuMode(this.PERSON,  listPeople.getSelectionModel().getSelectedItem());
}

@FXML
private void fileSelected(){
    MenuTest.setMenuMode(this.FILE, listFiles.getSelectionModel().getSelectedItem());
}
}

However I'm not sure that it's the best solution, especially considering the if/elseif statement will need to be altered whenever I add a new element type and its corresponding edit options. So is there any way that I can do this better?

有帮助吗?

解决方案

I think if your application has only a few (2-4) different types of "things" that are represented by a AnchorPane, then your approach is totally fine. An alternative to your approach is the state pattern. In that case, your currently selected "item type" would be your state.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top