Keylistener

Status
Nicht offen für weitere Antworten.

dl85hej

Mitglied
Hallo Freunde!

Stecke im KeyListener fest!
Nach dem JAVA Handbuch habe ich meine Klasse wie folgt erweitert:
Code:
public class meineKlasse 
extends Frame

dann wird nach dem Handbuch der Konstruktor wie folgt erstellt:
Code:
public meineKlasse(){
           addKeyListener(new MyKeyListener());
       }


Dann wird nach dem Handbuch eine weitere Klasse integriert...

Code:
class MyKeyListener
extends KeyAdapter
{
public void keyPressed(KeyEvent event) {
if(event.getKeyCode()== KeyEvent.VK_ESCAPE){
t.interrupt();    
}
}

Das Programm läuft, aber nichts passiert...

Ich rieche 2 Probleme:
1. mein Eent wird ignoriert
2. die Methode interrup() meines Threads t wird nicht erkannt....


hmmm
 
ich seh da auf anhieb nichts. Wie alt ist denn das Buch? "Frame" ist samt der ganzen AWT-guis ein wenig überholt, und das seit... einem halben jahrzehnt oder sogar noch länger, kA? Und Klassennamen schreibt man Groß.

poste doch einfach mal den kompletten code.
 
Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package projekt1;
import java.io.*;
import java.awt.*;
import java.awt.event.*;

/**
 *
 * @author dl85hej
 */
public class projekt1 
    extends Frame
{    
    public String  pfad, Zeichenkette, datei = "leer";
    public Boolean Ende = false;
    public static Integer Taste, Streifendauer, UGW, OGW, key,line = 0;
    public LineNumberReader f;
   

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args){
        // TODO code application logic here
        //Lade alle Daten für die Klasse
        Initialisierung();
        //eMail();
        
        //Streifendauer();
        
        //Methode Datei laden und Zeile ermitteln
        projekt1 mK = new projekt1();
        mK.Zeile();
        
        
        //hier wird die Streifendauer aus der Initialisierung genutzt
        //System.out.println(Streifendauer);
        Streifendauer = (Streifendauer * 100);
        //ohne neuen Thread (Teil eines Programms) würde die gesamte main schlafen 
       Thread t = new Thread(){
           @Override
           public void run(){
               System.out.println( "Es gibt ein Leben vor dem Tod.  " ); 
               while ( ! isInterrupted() ){
                   System.out.println( "Und er läuft und er läuft und er läuft" );
                   try{
                       Thread.sleep(Streifendauer);
                       }catch ( InterruptedException e ){
                           interrupt();
                           System.out.println( "Unterbrechung in sleep()" );
                       }
                   }
               System.out.println( "Das Ende" );
               }
           };
           t.start();   
       }
    
     
      
       
       public projekt1(){
           addKeyListener(new MyKeyListener());
       }
   
    
     public static void Exit(){
         System.exit(0);
     }
     
     public static void Initialisierung(){
        String zeile, Wachtmeister, UserID, smtp, Port;
        //Integer Streifendauer;
        Boolean Streifenart;
        
        System.out.println("projekt1 im Dienst!");
        System.out.println("Öffne config und...");
        try{
            //Der Aufruf new Filereader() erzeugt eine neue Instanz der Klasse FileReader
            //unter der Instanz(Referenzvariable) datei wird der Speicher reserviert
            FileReader datei = new FileReader("config.ini");
            //Klasse BufferedReader sorgt dafür, dass mit einem Lesezugriff 
            //blockweise gelesen wird und nicht zeichenweise
            //Vorteil: erhöht die Performance
            BufferedReader dat_read = new BufferedReader(datei);
            
            zeile = dat_read.readLine();
            System.out.println("Init1: ...lese den Wachtmeister "+ zeile);
            Wachtmeister = zeile;
            
            zeile = dat_read.readLine();
            System.out.println("Init2: ...lese die User -ID "+ zeile);
            UserID = zeile;
            
            zeile = dat_read.readLine();
            System.out.println("Init3: ...lese den smtp - Server "+ zeile);
            smtp = zeile;
            
            zeile = dat_read.readLine();
            System.out.println("Init4: ...lese den Port "+ zeile);
            Port = zeile;
            
            zeile = dat_read.readLine();
            System.out.println("Init5: ...lese die Streifendauer von "+ zeile + " Minuten");
            Streifendauer = Integer.parseInt(zeile);
            
            zeile = dat_read.readLine();
            System.out.println("Init6: ...lese die Art der Streife "+ zeile + " (true = Dauerstreife / false = Zeitstreife)");
            Streifenart = Boolean.valueOf(zeile);
            
            dat_read.close();
            System.out.println("...schließe config!");
        }
        catch (FileNotFoundException e)
        {
            System.out.println("Fehler 1: Datei nicht gefunden");
        }
        catch (IOException e)
        {
            System.out.println("Fehler 2: "+ e.getMessage());
        }
    }
     
     
     
     public static void Streifendienst(){
         String dummy;
         //meinObjekt1 für den Vorlauf Modulmontage Emden
         //Objekt hat die Referenzvariable - Name im Speicher - meinObjekt1
         projekt1 meinObjekt1;
         meinObjekt1 = new projekt1();
         
         projekt1 Datei1;
         Datei1 = new projekt1();
         
         Datei1.datei = "Vorlauf1.txt";
         //lies Zeile
         Datei1.line = 0;
         Datei1.Zeile();
         StringBuffer sb = new StringBuffer(Datei1.Zeichenkette);
         
         String satz = Datei1.Zeichenkette;
         //Vorlaufdatei zersplitten
         Integer x =0;
         String [] result = satz.split("\\s");
         
         for(int X=0;x<result.length;x++){
             StringBuffer sba = new StringBuffer(result[x]);
             sba.delete(0,7);
             result[x]=sba.toString();
             //das Produktionsbit vom Rest auswerten
             if (x == 6){
                 sba.delete(0,4);
                 result[6]=sba.toString();
                 //System.out.println(result[6]); 
             }
         }     
         
         //meinObjekt2 für die Direktläufer Modulmontage Emden
         //Objekt hat die Referenzvariable - Name im Speicher - meinObjekt1
         projekt1 meinObjekt2;
         meinObjekt2 = new projekt1();
         projekt1 Datei2;
         Datei2 = new projekt1();
         Datei2.datei = "result.ini";
         //DL - Quote SuSE1
         Datei2.line = 23;
         Datei2.Zeile();
         StringBuffer sb1 = new StringBuffer(Datei2.Zeichenkette);
         sb1.delete(0,5);
         //System.out.println(Datei2.Zeichenkette);
         
         
         
         //DL - Quote SuSE2
         Datei2.line = 24;
         Datei2.Zeile();
         StringBuffer sb2 = new StringBuffer(Datei2.Zeichenkette);
         sb2.delete(0,5);
         //System.out.println("After delete: " + sb2);
         //System.out.println(Datei2.Zeichenkette);
     }
    
     
     public void Zeile(){
     Integer i = -1;
     try{
         f = new LineNumberReader(new FileReader(datei));
         //System.out.println(datei);
         while(i < line){
             Zeichenkette = f.readLine();
             i++;
         } 
         f.close();
         }catch (FileNotFoundException e){
             System.out.println("Fehler 1: Datei nicht gefunden");
         }catch (IOException e){
             System.out.println("Fehler 2: "+ e.getMessage());
         }
     }

         
    public static void Vorlaufdaten(){
        System.out.println("Vorlaufdaten");
    }
    public static void Auswerten(){
        System.out.println("Auswerten");
    }
    public static void Alarm(){
        System.out.println("Alarm");
        System.out.println("komme aus dem Streifendienst");
    }
    
    class MyKeyListener
    extends KeyAdapter
    {

        @Override
    public void keyPressed(KeyEvent event) {
        if(event.getKeyCode()== KeyEvent.VK_ESCAPE){
            t.interrupt();   
        }
    }    
}
}
 
Zu aller erst: CodeConventions

2. Das kann niemals klappen. Du erzeugst in der main-Methode einen Thread t lokal und greifst unten im Listener darauf zu. Nicht dein interrupt wird nicht erkannt, sondern dein t. Es exisitiert doch da gar nicht. Mach den Thread zum Testen einfach global und greif dann auf t zu.

3. Gib irgendwas da unten aus oder debugge rein. Der kommt dahin. Jedenfalls soweit ich das irgendwie erkennen kann. 🙂

4. Schau dir bitte mal CodeConventions an. Auch wenn die im Buch Klassen klein und Methoden / Variablen groß schreiben, tu DU es nicht.
Beispiel: Vorlaufdaten() das sieht aus wie ein Konstruktor und nicht wie ein Methodenaufruf.
Mit einer gemeinsamen Basis ist es auch einfacher solche Blöcke zu verstehen.
 
Das Programm läuft, aber nichts passiert...
Ich kann das nicht nachvollziehen. hab's eben versucht zu kompilieren, 1:1 so wie du es gepostet hast, da steht in dicker roter Schrift:
t cannot be resolved
welcher compiler hat das denn trotz grober semantischer Fehler geschluckt?

Dass es mit Groß/kleinschreibung mächtig viel stress gibt wurde bereits erwähnt, dazu müsste man noch hinzufügen, dass die Klassennamen wirklich alles andere als sinnvoll gewählt sind.
das Buch ist von 2008
Wie heißt es?
Ich kann dir jedenfalls noch http://openbook.galileocomputing.de/javainsel8/ empfehlen, die 8. Auflage ist auch erst grad eben erschienen, und der Autor ist nicht grade dafür bekannt, gegen alle Sitten und Konventionen zu verstoßen.
 
@Andrey: das Buch heißt Handbuch der JAVA Programmierung; JAVA ist auch eine Insel ist soeben bestellt worden; Netbeans 6.1....

@Geeeee: Groß- und Kleinschreibung habe ich mir als nächstes auf die Fahne geschrieben...die Schuld liegt bei mir und nicht beim Autor...

JAVA ist auch eine Insel...aber eine komplett andere und dazu noch auf der anderen Halbkugel... 🙂
 
Hallo!

Habe mal ein neues Projekt erstellt...der KeyListener will einfach nicht auf mich hören:

Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tastaturevent;

import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author dl85hej
 */
public class Main
extends Frame
implements KeyListener{


    /**
     * @param args the command line arguments
     */
    public Main(){
        addKeyListener(this);
    }

    public static void main(String[] args) {
        // TODO code application logic here
        Boolean esc = false;
        while(esc==false){
            try {
                System.out.println("Ich bin ein Dauerläufer");
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    public void keyTyped(KeyEvent arg0) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void keyPressed(KeyEvent event,boolean esc) {
        //throw new UnsupportedOperationException("Not supported yet.");
        if(event.getKeyCode()==KeyEvent.VK_CONTROL){
            esc = true;
        }
    }

    public void keyReleased(KeyEvent arg0) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void keyPressed(KeyEvent arg0) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
 
Du musst auch eine Instanz der Klasse Main mit
[HIGHLIGHT="Java"]Main main = new Main();[/HIGHLIGHT]
erstellen. Sehen tust du dann aber immer noch nichts, da der Frame nicht angezeigt wird.
 
Und hol dir Eclipse Ganymede (oder ein anderes Eclipse).
Netbeans ist seeeehr langsam, und Eclipse unterstützt weit mehr/bessere Plugins.

Ausserdem haben >90% Eclipse, nicht nur hier. Wann immer du mal ein Problem mit dem Editor
oder mit Plugins/Frameworks hast, wirst du viel schneller fündig wenn du Eclipse nutzt.
 
Nein, sorry... nicht ganz richtig^^ das war nur einer der sehr vielen Punkte... Das ist doch alles totaler schrott.

SEHR wichtiger tipp: vor jede methode die du überschreibst, schreibst du ab jetzt @Override
Code:
    @Override
    public void keyPressed(KeyEvent event,boolean esc) {
        //throw new UnsupportedOperationException("Not supported yet.");
        if(event.getKeyCode()==KeyEvent.VK_CONTROL){
            esc = true;
        }
    }
Dann kriegst du nämlich sofort vom Compiler gesagt, dass du Mist gebaut hast, und brauchst nicht erst auf lahme Antworten aus irgendeinem Forum zu warten 😉
 
@Andrey:

ich habe keine Fenster...ich möchte aus einer fensterlosen Applikation die Tastatur abhören....
Das muss doch gehen...
 
ich bin mir nicht so sicher, ob das direkt mit java ohne umwege über jni geht...
wozu soll denn das auch gut sein?😕
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben