Button-Registrierung beim ActionListener erst NACH Tastendruck

  • Themenstarter Themenstarter Gelöschtes Mitglied 36296
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 36296

Gast
Hallo zusammen,

ich habe ein kleines Problem.
Ich habe ein JFrame in dem 3 Spalten sind (siehe 1. Foto).
Mit dem New-Button wird das Fenster um eine Zeile erweitert (siehe 2.Foto)
jetzt hätte ich gerne, dass die beiden Buttons (Rename und Delete) der neuen Zeile, erst nachdem der name in das textfeld eingegeben und mit enter bestätigt wurde, registriert werden. Der Grund ist, dass ich die Buttons (da sich die Anzahl verändern können muss) in einer LinkedList habe. Da ich den Index, wo die Buttons dann angehängt werden nicht kenne, muss ich mit getLast() darauf zugreifen. Daher dürfen die Buttons erst nach dem ENTER-Drücken registriert werden, da sonst die Buttons eine stelle davor erneut registriert werden, was ich nicht brauche.

Hier noch ein wenig Quellcode:
Java:
private void buttonRegister() {
		ok_button.addActionListener(this);
		cancel_button.addActionListener(this);
		new_button.addActionListener(this);
		newFund_textfield.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				Object o = e.getKeyCode();

				if (o.equals(KeyEvent.VK_ENTER)) {
					String s = newFund_textfield.getText();
					rename_delete_panel.remove(newFund_textfield);
					labels.add(new JLabel(s));
					rename_delete_panel.add(labels.getLast());
					rename_buttons.add(new JButton("Rename"));
					rename_delete_panel.add(rename_buttons.getLast());
					delete_buttons.add(new JButton("Delete"));
					rename_delete_panel.add(delete_buttons.getLast());
					delete_buttons.getLast().addActionListener(this);//<--
					rename_buttons.getLast().addActionListener(this);//<--
//Die beiden vorherigen Zeilen mag er nicht, da er das "this" dann nicht kennt...
//Das ist mein Problem, das es zu lösen gilt... ;)
					repaint();
					pack();
				}
			}
		});

...

	@Override
	public void actionPerformed(ActionEvent e) {
		Object o = e.getSource();

		if (o.equals(ok_button)) {
			dispose();

		} else if (o.equals(new_button)) {
			rename_delete_panel.add(newFund_textfield);
			newFund_textfield.setText("new Name");
			newFund_textfield.selectAll();
			newFund_textfield.updateUI();

		} else if (o.equals(cancel_button)) {
			dispose();

		} else {
			for (int i = 0; i < labels.size(); i++) {
				if (o.equals(rename_buttons.get(i))) {
					rename.setTextFieldText(labels.get(i).getText());
					rename.setVisible(true);
					index = i;
					break;
				} else if (o.equals(delete_buttons.get(i))) {
					rename_delete_panel.remove(labels.get(i));
					rename_delete_panel.remove(rename_buttons.get(i));
					rename_delete_panel.remove(delete_buttons.get(i));
					rename_buttons.remove(i);
					delete_buttons.remove(i);
					labels.remove(i);
					break;
				}
			}

		}
		repaint();
		pack();
	}


Im dritten Bild sieht man, dass nachdem der Name mit enter bestätigt wurde, die beiden Buttons (Rename und Delete) dahinter auftauchen, nur leider ohne beim ActionListener registriert zu sein...

Wäre es eventuell möglich das registrieren unten in der actionPerformed(..) zu machen und es irgendwie so zu machen, dass die actionPerformed(..) quasi auf das ende der keyPressed(..)-Methode wartet?

BTW:
Vielleicht kann mir auch noch jemand sagen, ob es eine bessere Variante gibt, heruszufinden, welcher Button gedrückt wurde (letzerer Teil in der actionPerformed). (Die Rename-Buttons, die Delete-Buttons und die Labels sind in jeweils einer eigenen LinkedList)
Danke schon mal 😉

Boldi
 

Anhänge

  • Settings1.JPG
    Settings1.JPG
    26,7 KB · Aufrufe: 34
  • Settings2.JPG
    Settings2.JPG
    30,4 KB · Aufrufe: 42
  • Settings3.JPG
    Settings3.JPG
    28,8 KB · Aufrufe: 31
Zuletzt bearbeitet von einem Moderator:
Das liegt daran dass sich das this in deinem Fall auf die anonyme Klasse bezieht. Du kannst allerdings auch auf das this der anderen Klasse zugreifen:
Java:
delete_buttons.getLast().addActionListener(DeineKlasse.this);
 

Neue Themen


Zurück
Oben