Problem mit Eventhandling (Anfängerfrage)

Status
Nicht offen für weitere Antworten.

Simighourt

Mitglied
Hallo, ich bin immer noch an meinem JavaPhone Projekt. Jetzt grade beim Eventhandling. Wenn die Nummerntasten gedrückt werden sollen wie bei einem Telefon die Ziffern im Display erscheinen. Als Anleitung dafür habe ich ein Blatt aus dem Info-Unterricht benutzt. Scheint aber nicht wirklich genau so zu funktionieren wie darauf beschrieben. Hier der Code:
Code:
import java.awt.*;

class JavaPhoneGui extends Frame {
  Button key1 = new Button("1");
  Button key2 = new Button("2");
  Button key3 = new Button("3");
  Button key4 = new Button("4");
  Button key5 = new Button("5");
  Button key6 = new Button("6");
  Button key7 = new Button("7");
  Button key8 = new Button("8");
  Button key9 = new Button("9");
  Button key0 = new Button("0");
  Button key_raute = new Button("#");
  Button key_stern = new Button("*");
  Button hookoff = new Button("Hook off");

  TextField display = new TextField();
  Label state = new Label("ready");
  Panel keyPanel = new Panel();
  Panel keyDisplayPanel = new Panel();
  Panel statePanel = new Panel();

  JavaPhoneGui() {
    setLayout(new BorderLayout(2,2));
    keyPanel.setLayout(new GridLayout(4,3,2,2));
    keyDisplayPanel.setLayout(new     BorderLayout(2,2));
    statePanel.setLayout(new BorderLayout(2,2));

    keyPanel.add(key1);
    keyPanel.add(key2);
    keyPanel.add(key3);
    keyPanel.add(key4);
    keyPanel.add(key5);
    keyPanel.add(key6);
    keyPanel.add(key7);
    keyPanel.add(key8);
    keyPanel.add(key9);
    keyPanel.add(key_raute);
    keyPanel.add(key0);
    keyPanel.add(key_stern);

    keyDisplayPanel.add(display, BorderLayout.NORTH);
    keyDisplayPanel.add(keyPanel, BorderLayout.CENTER);
    statePanel.add(hookoff,BorderLayout.CENTER);
    statePanel.add(state, BorderLayout.NORTH);

    add(keyDisplayPanel, BorderLayout.CENTER);
    add(statePanel, BorderLayout.WEST);
    

    setTitle("JavaPhone");
    setSize(300,300);
    setLocation(300,300);
    setResizable(false);
    setVisible(true);
    
    key1.addActionListener(new KeyListener());
    key2.addActionListener(new KeyListener());
    key3.addActionListener(new KeyListener());
    key4.addActionListener(new KeyListener());
    key5.addActionListener(new KeyListener());
    key6.addActionListener(new KeyListener());
    key7.addActionListener(new KeyListener());
    key8.addActionListener(new KeyListener());
    key9.addActionListener(new KeyListener());
    key0.addActionListener(new KeyListener());
    key_raute.addActionListener(new KeyListener());
    key_stern.addActionListener(new KeyListener());
    hookoff.addActionListener(new KeyListener());
  }
}

class KeyListener implements ActionListener {
  actionPerformed(ActionEvent e) {
    String ziffer = e.getActionCommand();
    display.setText(display.getText()+ziffer);
  }
}

Beim Compilieren bekomme ich folgende Meldung:

simon@simon:/daten/schule/java/JavaPhone$ javac JavaPhoneGui.java
JavaPhoneGui.java:75: invalid method declaration; return type required
actionPerformed(ActionEvent e) {
^
1 error
Erscheint eigentlich recht logisch die Meldung. Welchen Ausgabetyp hat den eine solche actionPerformed-Methode? Oder habe ich etwas anderes falsch gemacht? Danke für schnelles posten^^
Simon
 

L-ectron-X

Gesperrter Benutzer
Die Methode aus ActionListener heißt
public void actionPerformed(ActionEvent e)
und muss auch genau so überschrieben werden.

Und: Der Klassenname KeyListener ist sehr ungünstig gewählt, weil es im event-Package bereits ein solches Interface gibt. Das könnte mal Probleme geben, wenn du wirklich einen KeyListener in dieser Klasse brauchst.
 

Simighourt

Mitglied
Ok, ich habe die Zeile geändert und meine neue Klasse einfach Listener genannt. Jetzt bekomme ich folgende Meldung:

simon@simon:/daten/schule/java/JavaPhone$ javac JavaPhoneGui.java
JavaPhoneGui.java:74: cannot resolve symbol
symbol : class ActionListener
location: class Listener
class Listener implements ActionListener {
^
JavaPhoneGui.java:75: cannot resolve symbol
symbol : class ActionEvent
location: class Listener
public void actionPerformed(ActionEvent e) {
^
JavaPhoneGui.java:58: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key1.addActionListener(new Listener());
^
JavaPhoneGui.java:59: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key2.addActionListener(new Listener());
^
JavaPhoneGui.java:60: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key3.addActionListener(new Listener());
^
JavaPhoneGui.java:61: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key4.addActionListener(new Listener());
^
JavaPhoneGui.java:62: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key5.addActionListener(new Listener());
^
JavaPhoneGui.java:63: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key6.addActionListener(new Listener());
^
JavaPhoneGui.java:64: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key7.addActionListener(new Listener());
^
JavaPhoneGui.java:65: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key8.addActionListener(new Listener());
^
JavaPhoneGui.java:66: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key9.addActionListener(new Listener());
^
JavaPhoneGui.java:67: addActionListener(java.awt.event.ActionListener) in java.awt.Button cannot be applied to (Listener)
key0.addActionListener(new Listener());
^
JavaPhoneGui.java:68: cannot resolve symbol
symbol : class KeyListener
location: class JavaPhoneGui
key_raute.addActionListener(new KeyListener());
^
JavaPhoneGui.java:69: cannot resolve symbol
symbol : class KeyListener
location: class JavaPhoneGui
key_stern.addActionListener(new KeyListener());
^
JavaPhoneGui.java:70: cannot resolve symbol
symbol : class KeyListener
location: class JavaPhoneGui
hookoff.addActionListener(new KeyListener());
^
JavaPhoneGui.java:77: cannot resolve symbol
symbol : variable display
location: class Listener
display.setText(display.getText()+ziffer);
^
JavaPhoneGui.java:77: cannot resolve symbol
symbol : variable display
location: class Listener
display.setText(display.getText()+ziffer);
^
17 errors
Was genau bedeutet das?
 

L-ectron-X

Gesperrter Benutzer
Ich habe mal noch drei Fehler korrigiert.
1. Du musst noch das Package java.awt.event importieren.
2. Wenn du das so machst, musst deine Listener-Klasse als innere Klasse angelegt sein, da diese sonst nicht auf die Instanzvariablen Zugriff hat.
3. Instanzvariablen private deklarieren.
4. Code zum Schließen des Fensters eingebaut.
5. main()-Methode zum Starten/Testen eingefügt.

Der Code sieht danach nun so aus:
Code:
import java.awt.*;
import java.awt.event.*;

class JavaPhoneGui extends Frame {
  private Button key1 = new Button("1");
  private Button key2 = new Button("2");
  private Button key3 = new Button("3");
  private Button key4 = new Button("4");
  private Button key5 = new Button("5");
  private Button key6 = new Button("6");
  private Button key7 = new Button("7");
  private Button key8 = new Button("8");
  private Button key9 = new Button("9");
  private Button key0 = new Button("0");
  private Button key_raute = new Button("#");
  private Button key_stern = new Button("*");
  private Button hookoff = new Button("Hook off");

  private TextField display = new TextField();
  private Label state = new Label("ready");
  private Panel keyPanel = new Panel();
  private Panel keyDisplayPanel = new Panel();
  private Panel statePanel = new Panel();

  JavaPhoneGui() {
    setLayout(new BorderLayout(2,2));
    keyPanel.setLayout(new GridLayout(4,3,2,2));
    keyDisplayPanel.setLayout(new BorderLayout(2,2));
    statePanel.setLayout(new BorderLayout(2,2));
    
    addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
          System.exit(0);
       }
    });

    keyPanel.add(key1);
    keyPanel.add(key2);
    keyPanel.add(key3);
    keyPanel.add(key4);
    keyPanel.add(key5);
    keyPanel.add(key6);
    keyPanel.add(key7);
    keyPanel.add(key8);
    keyPanel.add(key9);
    keyPanel.add(key_raute);
    keyPanel.add(key0);
    keyPanel.add(key_stern);

    keyDisplayPanel.add(display, BorderLayout.NORTH);
    keyDisplayPanel.add(keyPanel, BorderLayout.CENTER);
    statePanel.add(hookoff,BorderLayout.CENTER);
    statePanel.add(state, BorderLayout.NORTH);

    add(keyDisplayPanel, BorderLayout.CENTER);
    add(statePanel, BorderLayout.WEST);

    setTitle("JavaPhone");
    setSize(300,300);
    setLocation(300,300);
    setResizable(false);
    setVisible(true);

    key1.addActionListener(new Listener());
    key2.addActionListener(new Listener());
    key3.addActionListener(new Listener());
    key4.addActionListener(new Listener());
    key5.addActionListener(new Listener());
    key6.addActionListener(new Listener());
    key7.addActionListener(new Listener());
    key8.addActionListener(new Listener());
    key9.addActionListener(new Listener());
    key0.addActionListener(new Listener());
    key_raute.addActionListener(new Listener());
    key_stern.addActionListener(new Listener());
    hookoff.addActionListener(new Listener());
  }

   class Listener implements ActionListener {
     public void actionPerformed(ActionEvent e) {
       String ziffer = e.getActionCommand();
       display.setText(display.getText()+ziffer);
     }
   }
   
   public static void main(String[] args) {
      new JavaPhoneGui();
   }
}
 

Leroy42

Top Contributor
Wenn du (Lectron) dir schon so viel Mühe gegeben hast,
den Source zu korrigieren, dann verstehe ich nicht,
wieso du SemiJoghurt nicht darauf hingewiesen hast, daß
Code:
    key1.addActionListener(new Listener()); 
    key2.addActionListener(new Listener()); 
    key3.addActionListener(new Listener());
    ...

unnötig ist. Da der Listener sowieso schon nachschaut,
durch welchen Button er aktiviert wurde, brauch doch
nicht jeder key einen eigenen Listener. Für Linksdrehend:

Code:
    ActionListener al = new Listener();
    key1.addActionListener(al); 
    key2.addActionListener(al); 
    key3.addActionListener(al);
    ...
 

L-ectron-X

Gesperrter Benutzer
Hast natürlich recht! Mein Fehler. Mach ich nie, nie wieder. :wink:
Schlimmer finde ich, dass du, Leroy23, meinen Nick nicht richtig schreiben kannst... :wink: :lol:
 

Leroy42

Top Contributor
Tja, du hast dir das Wochende redlich verdient. :cool:

[schild=6 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Zweideutigkeiten dürfen ohne Rücksprache entsorgt werden.[/schild]
 

Leroy42

Top Contributor
L-ectron-X hat gesagt.:
Schlimmer finde ich, dass du, Leroy23, meinen Nick nicht richtig schreiben kannst... :wink: :lol:

Das ist meine natürlich Faulheit(*) und bedeutet keine Herabwürdigung.


Aber ich bin ja nicht so: Wenn ich irgendwann mal mein Multi-Copy-Paste-Utility
in Java verwirklicht habe, bekommt dein Name einen Top-10 Eintrag; damit können
wir dann beide leben :toll:

[schild=11 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1](*)Wer keinen Sinn für Faulheit hat, kann kein guter Programmierer werden![/schild]
 

Simighourt

Mitglied
Moment, eine Frage hätte ich dann doch noch: Was ist das:
Code:
    addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
          System.exit(0);
       }
    });
Habe diese "Klammer-Konstruktion" noch nie gesehen :shock:
 

L-ectron-X

Gesperrter Benutzer
Das ist eine Anweisung, in welcher ein Objekt einer so genannten anonymen Klasse (sie hat keine Referenz mit einem Namen) erzeugt wird. Innerhalb dieser Klasse, welche von WindowAdapter (eine "Bequemlichkeitsklasse") erbt, wird eine Methode des WindowListener-Interfaces überschrieben.
Die Klammersetzung dient der besseren Lesbarkeit.
Natürlich kann man es auch so schreiben, dann ist wieder zu erkennen, dass es eigentlich eine Anweisung ist:
Code:
addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
 

Leroy42

Top Contributor
Es handelt sich um eine innere, anonyme Klassendefinition
mit gleichzeitiger Instanzerzeugung und Übergabe dieser Instanz.

:shock:

Ich klabüser das mal auseinander.

Code:
class MeineErweiterungVonWindowAdapterDieIchNurEinmalBrauche extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
    System.exit(0);
  }
}
wäre die übliche Klassendefinition.

Code:
void init() {
   ...
   WindowAdapter wappi = new MeineErweiterungVonWindowAdapterDieIchNurEinmalBrauche extends WindowAdapter();

  addWindowListener(wappi);
}
wäre die übliche Erzeugung einer Instanz und dessen Übergabe an die Methode addWindowListener()

Code:
    addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
          System.exit(0);
       }});
ist die Abkürzung für uns schreibfaule Entwickler.

Zugegeben: Diese Syntax ist am Anfang wirklich gewöhnungsbedürftig. :autsch:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
M Problem beim Eventhandling AWT, Swing, JavaFX & SWT 5
Juelin Problem mit TextField.requestFocus(); AWT, Swing, JavaFX & SWT 17
Juelin Problem beim Laden Controller AWT, Swing, JavaFX & SWT 2
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
T DataBinding Problem AWT, Swing, JavaFX & SWT 5
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 15
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 0
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
T Swing Problem mit Datum und FormattedTextField AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
olfibits JavaFX Problem mit HTMLEditor AWT, Swing, JavaFX & SWT 0
W SWT hover-background-problem with first column in TreeViewer AWT, Swing, JavaFX & SWT 0
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0
N Swing Problem mit loop AWT, Swing, JavaFX & SWT 2
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
G Swing Splitpane Problem AWT, Swing, JavaFX & SWT 1
F Problem mit der FXML Rectangle Shape AWT, Swing, JavaFX & SWT 2
N JavaFX Stranges Problem mit der Autoscroll-Eigenschaft von Textareas AWT, Swing, JavaFX & SWT 0
E Java FX FXML Problem mit html Scriptausführung AWT, Swing, JavaFX & SWT 2
J JavaFX Intersect Problem mit Shapes AWT, Swing, JavaFX & SWT 10
R JavaFX MediaPlayer AVI-Problem AWT, Swing, JavaFX & SWT 1
M Swing Problem mit ListCellRenderer AWT, Swing, JavaFX & SWT 7
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
F GUI Auflösung ändern - Koordianten und Proportions Problem AWT, Swing, JavaFX & SWT 21
J Problem mit Button darstellung AWT, Swing, JavaFX & SWT 23
M Problem mit Layoutmanagern... Hilfe wäre sehr nett. AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Problem mit Variablen AWT, Swing, JavaFX & SWT 4
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
M Swing AttributiveCellTableModel addRow() Problem AWT, Swing, JavaFX & SWT 1
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
N JavaFX Problem mit table multiple selection AWT, Swing, JavaFX & SWT 5
K CheckBox Problem AWT, Swing, JavaFX & SWT 5
Grevak DisplayMode Problem seit Windows 10 AWT, Swing, JavaFX & SWT 2
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
B Swing Problem mit Bildpfad AWT, Swing, JavaFX & SWT 4
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
M Swing pack() Problem mit Taskleiste AWT, Swing, JavaFX & SWT 4
N Swing Choice- Problem! AWT, Swing, JavaFX & SWT 8
Q "AWT-EventQueue-0" Exception Problem AWT, Swing, JavaFX & SWT 4
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
P AWT Problem mit Platzierung (GridBagLayout) AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
N Swing CardLayout: Problem beim Wechsel zwischen den JPanels AWT, Swing, JavaFX & SWT 3
A Mini-Menu-Schriften. Ein Problem bei hohen DPI Zahlen AWT, Swing, JavaFX & SWT 2
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
G Swing Setvisible problem AWT, Swing, JavaFX & SWT 1
J JTabbedPane: close Button Problem AWT, Swing, JavaFX & SWT 2
Tom299 JavaFX -> fxmlLoader -> getResourceAsStream Problem AWT, Swing, JavaFX & SWT 1
T Problem: ComboBox und addItem AWT, Swing, JavaFX & SWT 5
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
T LayoutManager LookAndFeel-Problem AWT, Swing, JavaFX & SWT 4
F Problem mit Implementierung von Kollisionsabfrage AWT, Swing, JavaFX & SWT 5
vodkaz (javafx) Image Problem AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
B JavaFX Problem bei Kamera / Group, gesamte Scene bewegt sich mit AWT, Swing, JavaFX & SWT 0
L Swing Vier Gewinnt Problem AWT, Swing, JavaFX & SWT 2
Z GUI-Problem, finde meinen Fehler nicht! AWT, Swing, JavaFX & SWT 11
B JavaFX KeyEvent und Canvas draw Problem AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen


Oben