Search code examples
javaswtdrop-down-menufinal

final Combo and SelectionListener


Hi there mighty programmers, once again as n00b beginner I am asking for your help...

Problem is as follows, I have a child window, containing some labels, buttons and two drop down menus. I want to have a SelectionListener on one combo box, named 'name' so that selected value from this drop down will affect the selected value in the second Combo - desc.

How to do that?

if I uncomment

//desc.select(name.getSelectionIndex());

in

name.addSelectionListener(new SelectionAdapter())

eclipse wants me to change Combo desc and Combo name to final, which is not possible cuz it will require initialising them outside the loop spoiling my layout :(

Here is the code:

public void tariffAddWindow(final Shell childWindow) {

    childWindow.setText("add dialog");

    labels = new Label[operatorTariffData.getColumnNames().length];
    inputTexts = new Text[operatorTariffData.getColumnNames().length];
    final Button buttons[] = new Button[operatorTariffData.getColumnNames().length];

    Combo name = null;
    Combo desc = null;

    for (int i =1; i< operatorTariffData.getColumnNames().length; i++) {


            labels[i] = new Label(childWindow, SWT.NONE);
            labels[i].setText(operatorTariffData.getColumnNames()[i].toString());
            labels[i].setBackground(blue);          

        if (i == 3) {
            name = new Combo(childWindow, SWT.READ_ONLY | SWT.BORDER);
            name.setLayoutData(tLayout);
            buttons[i] = new Button(childWindow, SWT.PUSH);
            buttons[i].setText("e");
        } else if (i == 4) {
            desc = new Combo(childWindow, SWT.READ_ONLY | SWT.BORDER);
            desc.setLayoutData(tLayout);
            buttons[i] = new Button(childWindow, SWT.PUSH);
            buttons[i].setText("e");
        } else {

            inputTexts[i] = new Text(childWindow, SWT.None);
            //texts[i].setText(data.getData()[i].toString());
            inputTexts[i].setLayoutData(tLayout);

            buttons[i] = new Button(childWindow, SWT.TOGGLE);
            buttons[i].setText("x");
            buttons[i].setSelection(false);
        }
    }

    for (int i = 1; i < contentProvider.getTariffNames().getQueryRowCount(); i++) {
        name.add(contentProvider.getTariffNames().getQueryData()[i][3].toString());
        desc.add(contentProvider.getTariffNames().getQueryData()[i][2].toString());
    }

    name.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            //desc.select(name.getSelectionIndex());
        }
    });
}

Solution

    1. You can make desc and name fields in the class instead:

      class Foo extends Composite
      {
          Combo name;
          Combo desc;
      
          public void tarriffAddWindow(final Shell childWindow)
          {
              // ...
              name.addSelectionListener(new SelectionAdapter() {
                  public void widgetSelected(SelectionEvent e)
                      desc.select(name.getSelectionIndex());
                  }
              });
          }
      }
      
    2. You can simply set a final variable to desc and name:

      final Combo descRef = desc;
      final Combo nameRef = name;
      
      nameRef.addSelectionListener(new SelectionAdapter() {
          public void widgetSelected(SelectionEvent e)
              descRef.select(nameRef.getSelectionIndex());
          }
      });