ActionListener implementieren

Status
Nicht offen für weitere Antworten.

mmih

Mitglied
Hallo,

ich habe eine Klasse für eine GUI, die so aussieht:

Code:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.net.URL;
import javax.swing.*;

class Spielanzeige
{
	private ImageIcon imageIcon;
	private JFrame f;
	private JLabel pic;
	private JLabel statusLine;
	private JList forbiddenWords;
	private LabelList forbiddenList;
	private JList triedWords;
	private LabelList triedList;
	private JTextField insertWord;
	private JButton okButton;
	private JLabel timeCounter;
	private JButton anotherPic;
	
	private Boolean init = false;
	
	protected void setImage( URL url )
	{
		imageIcon = new ImageIcon(url);
	}

	static void addComponent( Container cont, GridBagLayout gbl,
			Component c, int x, int y, int width, int height,
			double weightx, double weighty )
	{
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.BOTH;
		gbc.gridx = x; gbc.gridy = y;
		gbc.gridwidth = width; gbc.gridheight = height;
		gbc.weightx = weightx; gbc.weighty = weighty;
		gbl.setConstraints( c, gbc );
		cont.add( c );
	}

public void createAndShowGUI()
	{
		LabelList forbiddenList = new LabelList();
		forbiddenList.addEntry( "verboten" );
		forbiddenList.addEntry( "illegal" );
		
		LabelList triedList = new LabelList();
		triedList.addEntry( "Versuch 1" );

		f = new JFrame();
		pic = new JLabel( imageIcon );
		statusLine = new JLabel( "Statuszeile" );
		forbiddenWords = new JList( forbiddenList.returnList() );
		triedWords = new JList( triedList.returnList() );
		insertWord = new JTextField();
		okButton = new JButton( "OK" );
		timeCounter = new JLabel( "Time" );
		anotherPic = new JButton( "anderes Bild" ); 

		f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		Container c = f.getContentPane();
		GridBagLayout gbl = new GridBagLayout();


		c.setLayout( gbl );
		//													x	y	w	h	wx	 wy
		addComponent( c, gbl, pic,							0,	0,	1,	7,	600,	580 );
		addComponent( c, gbl, statusLine,					0,	8,	3,	1,	600,	20 );
		addComponent( c, gbl, new JLabel("Tabu-Wörter:"),	1,	0,	2,	1,	200,	20 );
		addComponent( c, gbl, forbiddenWords,				1,	1,	2,	1,	200,	210 );
		addComponent( c, gbl, new JLabel("Eingabewörter:"),	1,	2,	2,	1,	200,	20 );
		addComponent( c, gbl, triedWords,					1,	3,	2,	1,	200,	210 );
		addComponent( c, gbl, new JLabel("Wort"),			1,	4,	2,	1,	200,	20 );
		addComponent( c, gbl, insertWord,					1,	5,	1,	1,	150,	20 );
		addComponent( c, gbl, okButton, 					2,	5,	1,	1,	50,		20 );
		addComponent( c, gbl, new JLabel(""),				1,	6,	2,	1,	200,	20 );
		addComponent( c, gbl, timeCounter,					1,	7,	1,	1,	100,	20 );
		addComponent( c, gbl, anotherPic,					2,	7,	1,	1,	100,	20 );
		f.setSize( 800, 600 );
		f.setVisible( true );
		init = true;
	}
	
	protected void ActionPerformed( ActionEvent insertEntry)
	{
		triedList.addEntry( insertWord.getText() );
		triedWords = new JList( triedList.returnList() );
	}
}

Die Anzeige der Komponenten funktioniert auch bereits, allerdings bin ich damit überfordert diese Klasse um ActionListener für zunächst folgende Funktionen zu erweitern: wenn der OK-Button gedrückt wird oder im JTextField insertWord die Enter-Taste gedrückt wird soll triedList.addEntry() mit dem Eingabewort aus dem JTextField insertWord aufgerufen und anschließend das JTextField erneut geladen (also mit allen Änderungen) werden.

Wie ist das möglich?

Danke,
Martin
 

m@nu

Bekanntes Mitglied
deine klasse muss das ActionListener-interface implementieren...

Code:
public class Spielanzeige implements ActionListener {
//...
damit musst die die actionPerformed-methode implementieren (hast du bereits gemacht, jedoch wird das "A" klein geschrieben ;) )

dann kannst du beim initialisieren folgendes machen:
Code:
f.addActionListener(this);

voilà :)
(die funktion die der actionlistener ausführen soll hab ich jetzt nicht angeschaut... aber da weist du ja was du haben willst :) )
 

mmih

Mitglied
Den ActionListener habe ich zum OKButton hinzugefügt (der JFrame f verträgt scheinbar keinen ActionListener).

Die Methode actionPerformed wird auch aufgerufen, aber wie bekomme ich die JList aktualisiert?
 

m@nu

Bekanntes Mitglied
ach ja sry, stimmt, den listener musst du dem button hinzufügen ;) *shameOnMe*

warum erstellst du deine JList nach jedem klick neu?
am allereinfachsten nutzt du ein DefaultListModel.
Code:
public class Spielanzeige implements ActionListener {
  private DefaultListModel model = new DefaultListModel();
  //...

Code:
// Beim initialisieren deines Frames:
triedWords = new JList(model);

Code:
   public void actionPerformed( ActionEvent insertEntry) 
   { 
      model.addElement(insertWord.getText()); 
   }

das DefaultListModel erweitert AbstractListModel, welches bereits alles nötige implementiert hat, um die JList über veränderungen im model zu informieren.

ps. such mal nach ListModel im google... du kannst dir auch ein eigenes ListModel basteln anstatt das DefaultListModel zu verwenden.
 

WieselAc

Top Contributor
Stimmt das ist natürlich die eleganteste Lösung.


Hier noch ein quick hack der ganz fies ist, aber meistens hilft:

Ganz brutal auf den Frame anwenden.

Code:
setVisilbe(false);
setVisilbe(true);


(Sollte man aber nitt machen. Nur wenn es schnell gehen muss)
 

mmih

Mitglied
Danke schon einmal für die bisherige Hilfe.

Ich habe zwischenzeitig noch Fehler in der LabelList gefunden und beseitigt. Desweiteren funktioniert jetzt auch das hinzufügen von Elementen zur Wortliste einwandfrei.

Aber ich habe immer noch Probleme mit dem "Kaffee": Wie kann ich die Eingabezeile nach Bestätigung löschen und die Statuszeile aktualisieren? Meine Ansätze in der ActionPerformed Methode (Spielanzeige.java) helfen mir leider nicht weiter. Vielleicht kann ich ja noch einen Tipp bekommen?

Danke,
Martin

PS: Der Source liegt aktuell unter der oben genannten URL. Es ist wahrscheinlich das einfachste, sich das gesamte Projekt ansehen zu können.
 

m@nu

Bekanntes Mitglied
Code:
insertWord.setText("");  // text löschen
statusLine.setText("Dein Status");

... oder nicht?
 

mmih

Mitglied
Hallo,

jetzt bin ich in folgener Situation:

ich habe einen zweiten ActionListener erstellt, mit dem ich ein neues Bild laden möchte. Dieser funktioniert auch einwandfrei, jedoch nur wenn der erste ActionListener auskommentiert ist. Wie schaffe ich es, dass ich beide aktiv haben kann?

Wie kann ich das Bild auf maximal 580 Pixel Höhe sowie 600 Pixel Breite (abhängig von der größten Seitenlänge) herunterzoomen, sofern dies erforderlich ist? (Wenn der ActionListener für das Bild aktiv ist wird mit Klick auf den Button ein übergroßes Bild geladen.)

Der Quellcode ist wieder unter der bereits genannten URL http://www.mmih.de/ESPGame/ESPGame.zip gespeichert.

Danke,
Martin
 

m@nu

Bekanntes Mitglied
du kannst pro klasse natürlich nur eine methode mit dem selben namen haben.
es gibt zwei möglichkeiten:

entweder du erstellst 2 innere klassen, welche beide einen ActionListener implementieren:
Code:
public class Spielanzeige {
//...

  public void createAndShowGUI() {
    //...
    okButton.addActionListener(new Listener1());
    anotherPic.addActionListener(new Listener2());
    //...
  }

  private class Listener1 implements ActionListener {
    public void actionPerformed(ActionEvent ae) {
      // listener 1 code...
    }
  }

  private class Listener2 implements ActionListener {
    public void actionPerformed(ActionEvent ae) {
      // listener 2 code...
    }
  }
}
(anstatt inneren klassen kannst du natürlich auch ne ganz normale klasse schreiben... gibt einfach wieder eine neue sourcedatei, welche für andere klassen nicht wirklich von nutzen sein werden, denk ich mal)


ich persönlich bevorzuge jedoch folgende variante (vorallem dann, wenn es sich um einen kleineren actionlistener handelt)
Code:
public class Spielanzeige {
  private JButton okButton;
  private JButton anotherPic;
  //...

  public void createAndShowGUI() {
    //...
    MyActionListener listener = new MyActionListener();
    okButton.addActionListener(listener);
    anotherPic.addActionListener(listener);
    //...
  }

  private class MyActionListener implements ActionListener {
    public void actionPerformed(ActionEvent ae) {
      Object source = ae.getSource();

      if(source.equals(okButton)) {
        // listener 1 code
      } else if(source.equals(anotherPic)) {
        // listener 2 code
      }
    }
  }
}

sind natürlich nur vorschläge... gibt noch zig andere möglichkeiten...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10
M Anonymer ActionListener AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
M getSource() findet Button nicht - ActionListener AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben