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
 

The_S

Top Contributor
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.
 

Saxony

Top Contributor
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
 

chrissy

Bekanntes Mitglied
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
 

chrissy

Bekanntes Mitglied
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 :oops:

chrissy
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JButton und ActionListener Allgemeine Java-Themen 3
F System Tray Menubutton ActionListener Allgemeine Java-Themen 5
V Event Handling ActionListener nur bei "checked" CheckBoxMenuItem Allgemeine Java-Themen 2
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
C ActionListener - ToggleButton als von KI geklickt "markieren" Allgemeine Java-Themen 2
A ActionListener blockiert Bedienung des ganzen Systems Allgemeine Java-Themen 8
Z Swing Problem mit ActionListener Allgemeine Java-Themen 6
X getText undefiniert in ActionListener Allgemeine Java-Themen 5
D ActionListener wird mit jedem Mal öfter aufgerufen Allgemeine Java-Themen 2
P Variablen Variable von void im ActionListener verwenden Allgemeine Java-Themen 3
F Swing NetBeans nimmt ActionListener nicht an. Allgemeine Java-Themen 2
C Event Handling ActionListener manuell auslösen Allgemeine Java-Themen 8
G Button-Registrierung beim ActionListener erst NACH Tastendruck Allgemeine Java-Themen 2
P ActionListener / Label Name auslesen Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
T ActionListener und Singleton Allgemeine Java-Themen 15
J ActionListener-Klasse will Methode nicht annehmen Allgemeine Java-Themen 6
G Übergabeparameter an ActionListener Allgemeine Java-Themen 9
Z Mit ActionListener in anderem Frame lauschen? Allgemeine Java-Themen 3
W 2 Klassen + ActionListener Allgemeine Java-Themen 2
G Anonymen Buttons in for schleife ActionListener hinzufügen Allgemeine Java-Themen 5
C JTree: ActionListener auf die Nodes Allgemeine Java-Themen 3
MQue ActionListener und GUI trennen Allgemeine Java-Themen 3
L ActionListener / Buttons Allgemeine Java-Themen 8
E ActionListener Allgemeine Java-Themen 8
TheJavaKid Programmablauf anhalten bis actionlistener ausgeführt wurde Allgemeine Java-Themen 6
minzel ActionListener aus Package Allgemeine Java-Themen 24
F AbstractAction und ActionListener Allgemeine Java-Themen 2
J variablen wert ändernung mit einer art actionlistener? Allgemeine Java-Themen 4
K ActionListener ohne implements? Allgemeine Java-Themen 2
L ActionListener > Variable ... u.v.m. Allgemeine Java-Themen 19
W ActionListener + Klasse einbinden Allgemeine Java-Themen 2
H Runtime reagiert erst wenn Programm abbricht Allgemeine Java-Themen 1
P MouseListener reagiert 2 Mal Allgemeine Java-Themen 11
P Methode keyPressed() reagiert nicht im Browser Allgemeine Java-Themen 6
R DocumentListener: Programm Reagiert nicht mehr Allgemeine Java-Themen 2
S Reagiert JavaIO auf InterruptedExceptions..? Allgemeine Java-Themen 2
G java als dienst, welcher auf tastatureingaben reagiert Allgemeine Java-Themen 6
J Java reagiert nicht mehr auf die Tastatur Allgemeine Java-Themen 2
G Java/Eclipse reagiert nicht auf Aenderungen Allgemeine Java-Themen 6
A Wie mach ich, das mein Button schneller reagiert. Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben