Initialize Map of EnumMap

11,888

I finally figured out how to initialize the above Map. The trick to initializing it without having all those un-necessary temporaries was to use nested double brace initialization as follows:

// Map<String, EnumMap<Connection, SimpleEntry<Label, CheckBox>>>
mWidgetInfo = new HashMap() {{
    put("service1", new EnumMap(Connection.class) {{
        put(Connection.Connection1, new SimpleEntry<>(mService1Label1, mService1CheckBox1));
        put(Connection.Connection2, new SimpleEntry<>(mService1Label2, mService1CheckBox2));
        put(Connection.Connection3, new SimpleEntry<>(mService1Label3, mService1CheckBox3));
        put(Connection.Connection4, new SimpleEntry<>(mService1Label4, mService1CheckBox4));
    }});
    put("service2", new EnumMap(Connection.class) {{
        put(Connection.Connection1, new SimpleEntry<>(mService2Label1, mService2CheckBox1));
        put(Connection.Connection2, new SimpleEntry<>(mService2Label2, mService2CheckBox2));
        put(Connection.Connection3, new SimpleEntry<>(mService2Label3, mService2CheckBox3));
        put(Connection.Connection4, new SimpleEntry<>(mService2Label4, mService2CheckBox4));
    }});
    put("service3", new EnumMap(Connection.class) {{
        put(Connection.Connection1, new SimpleEntry<>(mService3Label1, mService3CheckBox1));
        put(Connection.Connection2, new SimpleEntry<>(mService3Label2, mService3CheckBox2));
        put(Connection.Connection3, new SimpleEntry<>(mService3Label3, mService3CheckBox3));
        put(Connection.Connection4, new SimpleEntry<>(mService3Label4, mService3CheckBox4));
    }});
}};

Then later I can iterate over all the widgets in the collection - for example initializing the tooltip help and setting a default label as follows:

// initialize the tooltips & default labels
mWidgetInfo.forEach((k, v)-> {
    // no need to switch on the service
    // disable click events on the checkboxes
    // as they should be read only
    v.forEach((k1, widgetPair)-> {
        widgetPair.getKey().setTooltip(
            new Tooltip("Connect ID"));
        CheckBox checkBox = widgetPair.getValue();
        checkBox.setTooltip(new Tooltip("Servicing Connection"));
        checkBox.setOpacity(1);
    });
});
Share:
11,888
johnco3
Author by

johnco3

Developer - Aerospace Industry

Updated on July 18, 2022

Comments

  • johnco3
    johnco3 almost 2 years

    I need to initialize the following private member in a JavaFX application where I am trying to organize gui widgets, however I do not know the correct syntax, could someone please let me know the correct syntax:

    Here is the enum I am using for my EnumMap

    enum Connection {
        Connection1,
        Connection2,
        Connection3,
        Connection4;
    }
    

    Here are a selection of the widgets that I am trying to organize with this map or EnumMaps based on a service name key, so the following list of 4 checkboxes and labels belong together, (I have similar JavaFX widgets for service 2 and so forth.

    @FXML
    private CheckBox mService1CheckBox1;
    @FXML
    private CheckBox mService1CheckBox2;
    @FXML
    private CheckBox mService1CheckBox3;
    @FXML
    private CheckBox mService1CheckBox4;
    @FXML
    private Label mService1Label1;
    @FXML
    private Label mService1Label1;
    @FXML
    private Label mService1Label1;
    @FXML
    private Label mService1Label1;
    

    This is the private Member I am trying to initialize with JavaFX widgets

    private Map<String, EnumMap<Connection, AbstractMap.SimpleEntry<Label,
    CheckBox>>> mWidgetInfo;
    

    I can initialize the top level empty mServiceWidgetMap with:

    mWidgetInfo= new HashMap<>();
    

    And I know that I need to initialize the EnumMaps as new EnumMap<>(Connection.class); but I also need to put pairs of widgets in the value size of these EnumMaps and I am confused as to how to do this.

    However I don't know how to initialize the enumMap value pairs. Syntax help much appreciated.

    EDIT After struggling for a while I came up with the following, but surely there has got to be a simpler approach like double brace initialization or some other less verbose approach.

    private void initializeServiceHeartbeatTab() {
        // @JC Todo - dynamically create base on CSV rows
        // Map<String, EnumMap<Connection, SimpleEntry<Label, CheckBox>>>
        EnumMap<Connection, SimpleEntry<Label, CheckBox>> service1Info =
            new EnumMap<>(Connection.class);
        SimpleEntry<Label, CheckBox> pair1 = new SimpleEntry<>(
            mService1Label1, mService1CheckBox1);
        SimpleEntry<Label, CheckBox> pair2 = new SimpleEntry<>(
            mService1Label2, mService1CheckBox2);
        SimpleEntry<Label, CheckBox> pair3 = new SimpleEntry<>(
            mService1Label3, mService1CheckBox3);
        SimpleEntry<Label, CheckBox> pair4 = new SimpleEntry<>(
            mService1Label4, mService1CheckBox4);
        service1Info.put(Connection.Connection1, pair1);
        service1Info.put(Connection.Connection1, pair2);
        service1Info.put(Connection.Connection1, pair3);
        service1Info.put(Connection.Connection1, pair4);
    
        EnumMap<Connection, SimpleEntry<Label, CheckBox>> service2Info = 
            new EnumMap<>(Connection.class);
        pair1 = new SimpleEntry<>(mService2Label1, mService2CheckBox1);
        pair2 = new SimpleEntry<>(mService2Label2, mService2CheckBox2);
        pair3 = new SimpleEntry<>(mService2Label3, mService2CheckBox3);
        pair4 = new SimpleEntry<>(mService2Label4, mService2CheckBox4);
        service2Info.put(Connection.Connection1, pair1);
        service2Info.put(Connection.Connection1, pair2);
        service2Info.put(Connection.Connection1, pair3);
        service2Info.put(Connection.Connection1, pair4);
    
        EnumMap<Connection, SimpleEntry<Label, CheckBox>> service2Info = 
            new EnumMap<>(Connection.class);
        pair1 = new SimpleEntry<>(mService3Label1, mService3CheckBox1);
        pair2 = new SimpleEntry<>(mService3Label2, mService3CheckBox2);
        pair3 = new SimpleEntry<>(mService3Label3, mService3CheckBox3);
        pair4 = new SimpleEntry<>(mService3Label4, mService3CheckBox4);
        service3Info.put(Connection.Connection1, pair1);
        service3Info.put(Connection.Connection1, pair2);
        service3Info.put(Connection.Connection1, pair3);
        service3Info.put(Connection.Connection1, pair4);
    
        mWidgetInfo = new HashMap<>();
        mWidgetInfo.put("albf", service1Info);
        mWidgetInfo.put("fms1", service2Info);
        mWidgetInfo.put("fms2", service3Info);
    }