ActionListener reagiert zu oft

Status
Nicht offen für weitere Antworten.

chrissy

Bekanntes Mitglied
Hallo,

ich habe eine Form, bei der nach Auswahl in 2 Comboboxen Textfelder und Checkboxen dynamisch erstellt werden.
Code:
  private void createStep3()
  {
    pnlStep3 = new JPanel(new GridBagLayout());
    pnlStep3.setVisible(true);
    

    int widthSum = summary.getPreferredSize().width;

    lblKA = new JLabel(langPack.getString("kA"));
    Dimension dimLabel = lblKA.getPreferredSize();
    dimLabel.width = widthSum * 1 / 3;
    lblKA.setPreferredSize(dimLabel);

    String[] strKA =
    { langPack.getString("CaseMin"), langPack.getString("CaseMid"), 
      langPack.getString("CaseMax") };
    cboKA = new SteppedComboBox(strKA);
    
    //Default parameter
    Vector Value = new Vector();
    Value.add("F ");
    Value.add("p ");
    Value.add("<html><font>T<sub>amb</sub>  </font>");

    Vector Unit = new Vector();
    Unit.add("[N]");
    Unit.add("<html><font>[N/mm<sup>2</sup>] </font>");
    Unit.add("[\u00B0C]");

    Vector Tooltip = new Vector();
    Tooltip.add(langPack.getString("Force"));
    Tooltip.add(langPack.getString("p"));
    Tooltip.add(langPack.getString("Tamb"));

    if (cboStep1.getSelectedIndex() == 1)
    {
      Value.add("t ");
      Unit.add("[h]");
      Tooltip.add(langPack.getString("t"));
    }
    else if (cboStep1.getSelectedIndex() == 2)
    {
      Value.add("<html><font>s<sub>W,crit</sub>  </font>");
      Unit.add("[\u00B5m]");
      Tooltip.add(langPack.getString("sWcrit"));
    }

    if ((cboStep2.getSelectedIndex() == 1) || 
        (cboStep2.getSelectedIndex() == 5))
    {
      Value.add("U ");
      Value.add("D ");
      Value.add("B ");
      Unit.add("[m/s]");
      Unit.add("[mm]");
      Unit.add("[mm]");
      Tooltip.add(langPack.getString("U"));
      Tooltip.add(langPack.getString("D"));
      Tooltip.add(langPack.getString("B"));
    }
    else if ((cboStep2.getSelectedIndex() == 2) || 
             (cboStep2.getSelectedIndex() == 4))
    {
      Value.add("\u03C6 ");
      Value.add("\u03A9 ");
      Value.add("D ");
      Value.add("B ");
      Unit.add(langPack.getString("UnitGrad"));
      Unit.add("[Hz]");
      Unit.add("[mm]");
      Unit.add("[mm]");
      Tooltip.add(langPack.getString("phi"));
      Tooltip.add(langPack.getString("Omega"));
      Tooltip.add(langPack.getString("D"));
      Tooltip.add(langPack.getString("B"));
    }
    else if (cboStep2.getSelectedIndex() == 3)
    {
      Value.add("\u03C6 ");
      Value.add("\u03A9 ");
      Value.add("<html><font>D<sub>i</sub>  </font>");
      Value.add("<html><font>D<sub>o</sub>  </font>");
      Unit.add(langPack.getString("UnitGrad"));
      Unit.add("[Hz]");
      Unit.add("[mm]");
      Unit.add("[mm]");
      Tooltip.add(langPack.getString("phi"));
      Tooltip.add(langPack.getString("Omega"));
      Tooltip.add(langPack.getString("Di"));
      Tooltip.add(langPack.getString("Do"));
    }
      else if (cboStep2.getSelectedIndex() == 6)
      {
        Value.add("U ");
        Value.add("<html><font>D<sub>i</sub>  </font>");
        Value.add("<html><font>D<sub>o</sub>  </font>");
        Unit.add("[m/s]");
        Unit.add("[mm]");
        Unit.add("[mm]");
        Tooltip.add(langPack.getString("U"));
        Tooltip.add(langPack.getString("Di"));
        Tooltip.add(langPack.getString("Do"));
      }
    
    lblValue = new JLabel[Value.size()];
    lblUnit = new JLabel[Value.size()];
    txtInput = new JTextField[Value.size()];
    Dimension d = new Dimension(75, 25);
    if (defValue.isEmpty()) defValue = setDefaults();
    cboKA.setSelectedIndex(Integer.parseInt(defValue.elementAt(0).toString()));
    for (int i = 0; i < Value.size(); i++)
    {
      lblValue[i] = new JLabel(Value.elementAt(i).toString());
      lblValue[i].setHorizontalAlignment(JLabel.RIGHT);
      lblValue[i].setToolTipText(Tooltip.elementAt(i).toString());
      txtInput[i] = new JTextField();
      txtInput[i].setPreferredSize(d);
      txtInput[i].setText(defValue.elementAt(i + 1).toString());
      txtInput[i].setSelectionStart(0);
      txtInput[i].setSelectionEnd(txtInput[i].getText().length());
      txtInput[i].setHorizontalAlignment(JTextField.RIGHT);
      actualize();
      detailPanel.revalidate();
      navPanel.revalidate();
      lblUnit[i] = new JLabel(Unit.elementAt(i).toString());
      lblUnit[i].setHorizontalAlignment(JLabel.LEFT);
    }

    int row = 0;
    for (row = 0; row < 2; row++)
    {
      pnlStep3.add(lblValue[row], 
                   new GridBagConstraints(0, row, 1, 1, 0.0, 0.0, 
                                          GridBagConstraints.CENTER, 
                                          GridBagConstraints.BOTH, 
                                          new Insets(0, 0, 2, 0), 0, 0));
      pnlStep3.add(txtInput[row], 
                   new GridBagConstraints(1, row, 1, 1, 0.0, 0.0, 
                                          GridBagConstraints.CENTER, 
                                          GridBagConstraints.NONE, 
                                          new Insets(0, 0, 2, 0), 0, 0));
      pnlStep3.add(lblUnit[row], 
                   new GridBagConstraints(2, row, 1, 1, 0.0, 0.0, 
                                          GridBagConstraints.WEST, 
                                          GridBagConstraints.NONE, 
                                          new Insets(0, 5, 2, 0), 0, 0));
    }
    
    pnlStep3.add(lblKA, 
                 new GridBagConstraints(0, row, 1, 1, 0.0, 0.0, 
                                        GridBagConstraints.CENTER, 
                                        GridBagConstraints.BOTH, 
                                        new Insets(0, 0, 2, 0), 0, 0));
    pnlStep3.add(cboKA, 
                 new GridBagConstraints(1, row, 1, 1, 0.0, 0.0, 
                                        GridBagConstraints.CENTER, 
                                        GridBagConstraints.NONE, 
                                        new Insets(0, 0, 2, 0), 0, 0));
                                        
    row++;
        
    while (row <= Value.size())
    {
      pnlStep3.add(lblValue[row - 1], 
                   new GridBagConstraints(0, row, 1, 1, 0.0, 0.0, 
                                          GridBagConstraints.CENTER, 
                                          GridBagConstraints.BOTH, 
                                          new Insets(0, 0, 2, 0), 0, 0));
      pnlStep3.add(txtInput[row - 1], 
                   new GridBagConstraints(1, row, 1, 1, 0.0, 0.0, 
                                          GridBagConstraints.CENTER, 
                                          GridBagConstraints.NONE, 
                                          new Insets(0, 0, 2, 0), 0, 0));
      pnlStep3.add(lblUnit[row - 1], 
                   new GridBagConstraints(2, row, 1, 1, 0.0, 0.0, 
                                          GridBagConstraints.WEST, 
                                          GridBagConstraints.NONE, 
                                          new Insets(0, 5, 2, 0), 0, 0));
      row++;
    }
    
    chkLubi.setText(langPack.getString("Lubi"));
    if (!defValue.isEmpty())
    {
      chkLubi.setSelected(new Boolean(defValue.lastElement().toString()));
    }
    chkLubi.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent ae)
      {
        checkLubricated();
      }
    });
    pnlStep3.add(chkLubi, 
                 new GridBagConstraints(0, row, 3, 1, 1.0, 1.0, GridBagConstraints.WEST, 
                                        GridBagConstraints.NONE, 
                                        new Insets(2, 0, 2, 0), 0, 0));

    pnlStep3.revalidate();

    detailPanel.add(pnlStep3, 
                    new GridBagConstraints(0, 2, 2, 1, 1.0, 1.0, GridBagConstraints.CENTER, 
                                           GridBagConstraints.BOTH, 
                                           new Insets(2, 0, 0, 0), 0, 0));
    createState = 3;
    actualize();
    navPanel.revalidate();
  }

Das funktioniert soweit alles ganz gut, bis auf meine Checkboc (chkLubi). Wenn ich meine Auswahl in den ersten beiden Comboboxen ändere wird der oben gezeigte Code ausgeführt.
Bei Änderung von chkLubi wird eine MessageBox geöffnet. Ber ersten Laden von createStep3() wird diese Messagebox einmal aufgerufen, beim zweiten Laden zweimal, beim dritten Laden dreimal usw.
Wie kann ich das verhindern??? Ich möchte immer nur einmal die Messagebox haben. Irgendwie steh ich auf dem Schlauch. Habe schon ein checkLubi.removeActionListener() probiert, aber irgendwie komm ich nicht klar.
Ist für euch wahrscheinlich ein ganz simples Problem ...

Danke
chrissy
 
Ich hab jetzt keine lust 200 Zeilen Code zu analysieren, aber potentiell würde ich mal behaupten, dass du die Listener mehr als einmal hinzufügst, was natürlich nicht sein darf.
 
Yep und zwar genau hier:

Code:
chkLubi.addActionListener(new ActionListener() 
    { 
      public void actionPerformed(ActionEvent ae) 
      { 
        checkLubricated(); 
      } 
    });

Eine schnelle Lösung wäre:

Code:
if (chkLubi.getActionListeners().length == 0) {
    chkLubi.addActionListener(new ActionListener() 
        { 
          public void actionPerformed(ActionEvent ae) 
          { 
            checkLubricated(); 
          } 
        });
}

bye Saxony
 
ok ... aber wie kann ich nun verhindern, dass wenn der Listener bereits hinzugefügt wurde, er nochmal hinzugefügt wird. Kann ich irgendwie überprüfen, ob ein Listener bereits existiert???

chrissy
 
Danke Saxony,

da war ich wohl zu schnell mit meiner Frage, hatte dein Edit noch nicht gesehen, werd's aber sofort einfügen ...

funktioniert super ... muss halt doch noch einige Sachen lernen 😳

chrissy
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben