Polymorphie Programmdesign Frage

GhostfaceChilla

Bekanntes Mitglied
Hallo Leute.
Ich arbeite zur Zeit an einem kleinen Projekt, wo ich Befehle einer Fernbedienung entgegennehme und diese dann verarbeite. Nun habe ich mir diese 3 Klassen erstellt:

Java:
public class UsbDataInputListener implements UsbPipeListener {
    
    @Override
    public void errorEventOccurred(UsbPipeErrorEvent upee) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void dataEventOccurred(UsbPipeDataEvent upde) {
        final byte[] recData = upde.getData(); //Übertragene Bytes
        //Input wird überprüft
        //Aktion für die jeweilige Taste wird durchgeführt
        if(Arrays.equals(recData, Keys.POWER)){
            Key_Action.callShutdown();
        }
        ....
        ....
    }
Diese Klasse horscht auf eine ErrorEvent oder ein DataEvent. Ein DataEvent wird durch den Druck auf eine Taste aufgerufen.

Java:
public final class Keys {

    public static final byte[] POWER = {4,1}; 
    //Direkt Zugriff aus Musi,Spiele,Gallerie und Videos
    public static final byte[] MUSIC = {2,5,0,4,0,0,0,0,2,5,0,30,0,0,0,0};
    public static final byte[] GAME = {2,5,0,5,0,0,0,0,2,5,0,31,0,0,0,0};
    public static final byte[] GALLERY = {2,5,0,6,0,0,0,0,2,5,0,32,0,0,0,0};
    public static final byte[] VIDEO = {2,5,0,7,0,0,0,0,2,5,0,33,0,0,0,0};
    //Steurung für Film und Musik
    public static final byte[] BEFORE = {3,-74,0};
    public static final byte[] BEFORE2 = {2,0,0,0,0,0,0,0,3,-74,0};
    public static final byte[] NEXT = {3,-75,0};
    public static final byte[] NEXT2 = {2,0,0,0,0,0,0,0,03,-75,0};
    public static final byte[] BACKWARD = {3,-53,0};
    public static final byte[] BACKWARD2 = {2,0,0,0,0,0,0,0,03,-53,0};
    public static final byte[] FORWARD = {3,-54,0};
    public static final byte[] FORWARD2 = {2,0,0,0,0,0,0,0,03,-54,0};
    public static final byte[] PLAY = {3,-51,};
    public static final byte[] PLAY2 = {2,0,0,0,0,0,0,0,03,-51,0};
    public static final byte[] STOP = {3,-73,0};
    public static final byte[] STOP2 = {2,0,0,0,0,0,0,0,03,-73,0};
    //Nummernfeld und Navigation durch das Menü
    public static final byte[] NUMBER_ONE = {2,0,0,43,0,0,0,0,2,0,0,0,0,0,0,0};
    public static final byte[] UP = {2,0,0,82,0,0,0,0,2,0,0,0,0,0,0,0};
    public static final byte[] NUMBER_THREE = {2,-128,0,0,0,0,0,0,2,0,0,0,0,0,0,0};
    public static final byte[] LEFT = {2,0,0,80,0,0,0,0,2,0,0,0,0,0,0,0};
    public static final byte[] ENTER = {2,0,0,40,0,0,0,0,2,0,0,0,0,0,0,0};
    public static final byte[] RIGHT = {2,0,0,79,0,0,0,0,2,0,0,0,0,0,0,0};
    public static final byte[] NUMBER_SEVEN= {2,1,0,18,0,0,0,0,2,0,0,0,0,0,0,0};
    public static final byte[] DOWN = {2,0,0,81,0,0,0,0,2,0,0,0,0,0,0,0};
    public static final byte[] ESCAPE = {2,0,0,41,0,0,0,0,2,0,0,0,0,0,0,0};
    public static final byte[] ZERO = {2,0,0,0,0,0,0,0,2,4,0,43,0,0,0,0};
    //Lautstärkeregelung
    public static final byte[] VOL_UP = {3,-23,0};
    public static final byte[] VOL_DOWN = {3,-22,0};
    public static final byte[] MUTE = {3,-30,0};
}
Diese Klasse beinhaltet den jeweiligen bytecode der Tasten

Java:
public class Key_Action {
    
    private static final Runnable SHUTDOWN = new Runnable(){
        @Override
        public void run() {
            try {
                ShutdownInfoController isc = new ShutdownInfoController();
                Window shtdnWin = new Window("/app/view/ShutdownInfoView.fxml","Info zum Herunterfahren",
                                  isc,false);
            } catch (IOException ex) {
                Logger.getLogger(Keys.class.getName()).log(Level.SEVERE, null, ex);
            }
        }  
    };
    
    //Ruft das neue Fenster auf
    public static void callShutdown(){
        Platform.runLater(SHUTDOWN);
    }
    
    //PC wird heruntergefahren
    public static void actShutdown() throws IOException{
        String cmdtext = "shutdown.exe /s /hybrid /t 0 "; // Befehl um PC herunterzufahren
        Runtime.getRuntime().exec(cmdtext); // Befehl wird ausgeführt;
    }
    
    
}
Diese Klasse führt dann die eigentliche Aktion der Taste aus, hier z.B die POWER Taste.

Meine Frage wäre jetzt, ob das Programmieren so ok ist? Ich habe auch shcon überlegt eine Klasse Key zu erstellen und dieser die Konstanten und den inhalt der Klasse Key_Action zuzuweisen und eine Instanzvariable byte[], die die aktuelle Taste wiederspiegelt. Aber das fände ich persönlich komplizierter. Nun wollte ich fragen was ihr davon haltet?Kann man den code so lassen, wenn nicht wäre eine kurze Erklärung ganz hilfreich :)

-GhostfaceChilla-
 

Natac

Bekanntes Mitglied
Ich würde aus Keys ein enum machen, dass auch noch gleich ein paar schöne Methoden anbietet:

Java:
public enum Keys{
  POWER(4,1),
  MUSIC(2,5,0,4,0,0,0,0,2,5,0,30,0,0,0,0),
  
  //... 

  private byte[] bytes;

  private Keys(byte... bytes){// Konstruktor mit varargs ermöglicht byte-arrays verschiedener länge
    this.bytes = bytes;
  }

  public boolean equals(byte[] bytes){//Methode zum vergleichem mit einem andere byte-array
    return Arrays.equals(bytes, this.bytes);
  }

  public static Keys getKey(byte[] bytes){//Methode zum finden eines Keys bei gegebenem Byte-Array
    for(Keys key: values()){
      if(key.equals(bytes)){
        return key;
      }
    return null; // Vorsicht, NPE möglich!
  }

}
Damit ist die Klasse schon mal "Aufgeräumter". Und die Nutzung sieht dann auch schöner aus:
Java:
 public void dataEventOccurred(UsbPipeDataEvent upde) {
        final byte[] recData = upde.getData(); //Übertragene Bytes
        //Input wird überprüft
        //Aktion für die jeweilige Taste wird durchgeführt
        if(Keys.POWER.equals(recData)){
            Key_Action.callShutdown();
        }
        ....
        ....
    }[/Java]

Wenn die Aktion pro Taste immer gleich bleibt, könnte man überlegen, ob man das entsprechende Runnable auch mit ins Enum packt. Denn so wie es aktuell aussieht, prüfst du per if jede Taste durch. Das könnest du dann mit [code=Java]Keys key = Keys.getKey(upde);
if(key !=null){
  key.call();
}
abkürzen. call() ist dabei die Methode im Enum, die das entsprechende Runnable aufruft. Den Code dafür habe ich hier jetzt nicht geschrieben.
Vielleicht geht das aber auch schon zu weit. Poste mal mehr Code, dann kann man auch besser sagen, wie man den Code noch optimieren kann.

EDIT: Ist dir bewusst, dass 03 mit der führenden 0 oktal interpretiert wird? Also 03 = 3, 08 = 10, 09 = 11
 
Zuletzt bearbeitet:

GhostfaceChilla

Bekanntes Mitglied
Vielen Dank schonmal :)
Ja, die 03 soll als 03 da stehen, das is beabsichtig ;)
Und nein, jede Taste führt eine andere Aktion aus, daher muss auch mit if else alles durchgeprüft werden, ist zwar nervig, aber mit switch oder sonstigem ist die leider nicht zu realisier.

-GhostfaceChilla-
 

Gucky

Top Contributor
Wenn jetzt die letzte Taste gedrückt wird, musst du dennoch sämtliche Tasten prüfen. Das ist ein riesiger Overhead, den du dir aufbürdest. Und schön sieht es IMHO auch nicht aus.

Ich halte eine Art Binärbaum für besser, dass du die Tastatur in Bereiche zu vielleicht 10 oder weniger Tasten aufteilst und erst überprüfst, in welchem Bereich eine Taste gedrückt wurde und dementsprechend eine weiterführende Methode aufrufst.
 

Natac

Bekanntes Mitglied
Vielen Dank schonmal :)
Ja, die 03 soll als 03 da stehen, das is beabsichtig ;)
Und nein, jede Taste führt eine andere Aktion aus, daher muss auch mit if else alles durchgeprüft werden, ist zwar nervig, aber mit switch oder sonstigem ist die leider nicht zu realisier.

-GhostfaceChilla-
Natürlich führt jede Taste eine andere Aktion aus. Die Frage ist: ist diese Aktion pro Taste immer gleich?

Wenn ja, könntest du das enum eben entsprechend erweitern:

Java:
public enum Keys{
  POWER(new Runnable(){ // geht ab Java 8 mit Lambdas schöner
    public void run(){
       //Do power action
    }
  }, 4,1),
  
  MUSIC(new Runnable(){
    public void run(){
       //Do music action
    }
   }, 2,5,0,4,0,0,0,0,2,5,0,30,0,0,0,0),

   private Runnable action;
   private byte[] bytes;

   private Keys(Runnable action, byte... bytes){
     this.action = action;
     this.bytes = bytes;
   }

   public void callAction(){
    action.run();
  }

  //... weitere Methoden (s.o.)
}
Wenn die Aktionen der Keys sehr kompliziert sind, könnte man auch überlegen zusätzlich zum enum auf eine Klassen-Stuktur zu verwenden, die die Aktionen abbildet.
Also eine abstrakte Klasse "Key" definieren, und jeden Key als konkrete Klasse implementieren (PowerKey, MusicKey, etc...) die von "Key" erbt.
Dann statt Runnable einfach ein Key-Objekt im Enum verlangen und für jeden Enum-Eintrag die entsprechende Klasse instanzieren.

Die Grundidee ist: Jeder Key weiß selbst, was er machem muss. Dann kannst du deine if-else-Kaskake nämlich auf drei Zeilen kürzen:
Java:
public void dataEventOccurred(UsbPipeDataEvent upde) {
  byte[] bytes =  upde.getData();
  Keys key = Keys.getKey(bytes); //richtigen key raussuchen
  if(key != null){
    key.callAction();//aktion für diesen Key ausführen
  }
}
 
Zuletzt bearbeitet:

GhostfaceChilla

Bekanntes Mitglied
Ok, das mit dem Binärbaum müsste ich mir mal anschauen, wie das jetzt gemeint ist. Könntest du vielleicht etwas genauer ausführen wie du ds meints? Und das mit dem pro Taste eine Klasse, hab ich mir auch schon gedacht, das wäre ja eigentlich ja dann auch "OOP" oder? ;) Vielen dank Leute, bhatte gar nicht gewusst wie viel Verbesserungspotenzial in meinem Code steckt.

EDIT: Mir ist aufgefallen, das z.B alle Medienshortcuts mit [2,5,0] anfangen und z.B die Navigations- und Buchstabentasten mit [2,0,0] und die Videotasten alle mit [2,0,0,0,0,0,0,0,03] anfangen. D.h, ich könnte ja theoretisch nur 3 if Abfragen machen um eine kleine Auswahl auszugrenzen und dnn erst auf die genaue Taste prüfen oder ist das auch nicht so die schöne Art?

@Natac: Wie aber weis dein key Objekt, welche Taste es jetzt darstellt?Durch z.B key.getKey(byte[] b) weist man ja dann nur den Bytecode zu, aber d.h das Key Objekt weis ja nicht ob es jetzt ein PowerKey, MusicKey etc. ist ...

-GhostfaceChilla-
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
@Natac: Wie aber weis dein key Objekt, welche Taste es jetzt darstellt?Durch z.B key.getKey(byte[] b) weist man ja dann nur den Bytecode zu, aber d.h das Key Objekt weis ja nicht ob es jetzt ein PowerKey, MusicKey etc. ist ...

-GhostfaceChilla-
Doch das Key-Objekt weiß genau, welcher Schlüssel er ist. Das ist ja der Trick (der sich Polymorphie nennt). Ich erzeuge ja kein neues Key-Objekt, sondern suche nur das passende und gebe es zurück.

Ich habe vorrausgesetzt, dass du im Enum diese Methoden hast (hab ich vorherigem Post schon mal reingeschrieben):
Java:
// Instanz-Methode für einen Key: Passt das übergebene byte-Array (bytes) zu unserem byte-array (this.bytes)?
 public boolean equals(byte[] bytes){//Methode zum vergleichem mit einem andere byte-array
    return Arrays.equals(bytes, this.bytes); 
  }

//Statische Methode
public static Keys getKey(byte[] bytes){//Methode zum finden eines Keys bei gegebenem Byte-Array
    for(Keys key: values()){//values() liefert alle Werte des Enums als Array
      if(key.equals(bytes)){//Prüfen ob der Wert passt
        return key; // Enum-Wert zurückgeben
      }
    return null; // Kein Wert gefunden, NULL zurückgeben
}
Damit findest du zu jedem byte-Stream den passenden key. gibst du also 4,1 ein, so wird POWER zurückgegeben, da nur diese Enum-Konstante das gleiche Byte-Array hat.
 
Zuletzt bearbeitet:

Gucky

Top Contributor
@TO
Ja so was meinte ich. Das wär schon schöner, als für alles eine if-Abfrage zu haben. Danach kannst du es vielleicht noch mehr differenzieren.


Wenn du pro Taste eine Klasse erstellst, könntest du den Binärbaum noch auf die Spitze treiben und jede Taste durch ein Blatt des Binärbaumes repräsentieren lassen. Allerdings bräuchtest du dazu vermutlich eine eigene Klasse Tastenbaum, da du bei den Binärbäumen aus der API meines Wissens nach Keinen Ast mit einem Key, bestehend aus mehreren "Unterkeys" erstellen kannst. Das ist allerdings ein eher kleiner Aufwand.

Außerdem kannst du dann eine abstrakte Oberklasse Taste erstellen, die die Methode tasteVerhalten() o.Ä. bereitstellt, die aufgerufen wird. Dank des Polymorphismus wird immer die richtige Methode aufgerufen und du musst nicht wissen, welche Taste gedrückt wurde.
 

GhostfaceChilla

Bekanntes Mitglied
Vielen Dank euch zwei :)
Ok, ich glaube ich werde es so umsetzen wie Natac es beschrieb, scheint für mich die einfachste Lösung zu sein. Jedoch hätte ich noch eine Frage:
Da ich nicht viel mit Enums arbeite wollte ich Fragen, wo den jetzt der Unterschied zwischen Key als Enum und Key als Klasse ist?
 

Natac

Bekanntes Mitglied
Bei enum bist du explizit auf die vorhanden Instanzen begrenzt. Von einer Klasse kannst du soviele Instanzen anlegen wie du willst.

Wenn du allerdings bei den Klassen Ordnung walten lässt (bspw. protected oder default-Konstruktor), dann dürfte ich Klassen-Variante um einiges schöner werden. ;)
 

GhostfaceChilla

Bekanntes Mitglied
Ok, alles klar, dnake.
Jedoch iat mir aufgefallen das ich in einem Enum leider keine byte[] benutzen kann. Also wenn ich z.B folgendes anlege:
Java:
public enum Keys {

    //Bytecode für die verschiedenen Tasten
    POWER (4,1),
    //....
    
   private byte[] bytes;
              
    private Keys(byte... bytes){
        this.bytes = bytes;
    }

}

Dann weist der Compiler mich dauarf hin, das von (int,int) nicht nach byte[] konvertiert werden kann.Und dann jede Zahl zu casten erscheint mir übertrieben. Deswegen dneke ich, wäre eine normale Klasse besser.

-GhostfaceChilla-
 

Natac

Bekanntes Mitglied
Das varargs-Argument hat ja nichts mit dem enum zu tun. Den Konstruktor für die Klasse würde ich genauso schreiben.

Um dir Schreibaufwand zu ersparen würde ich dann den Konstruktor auf
Code:
int...
umstellen und im Konstruktor ein byte-array draus machen:
Java:
public Key(int... bytes){
  byte[] temp = new byte[bytes.length];
  for(int i = 0; i < bytes.length; i++){
    temp[i] = (byte) bytes[i];
  }
  this.bytes = temp;
}
Den Code schreibst du einmal und kannst danach in allen Konstruktoren bequem Zahlen benutzen, statt Dinge wie
Code:
new byte[]{4, 1}
oder
Code:
(byte)4, (byte)1
oder so schreiben zu müssen.

Wenn du eine falsche Zahl eingibst, fliegt dann eben eine ClassCastException. Wenn dir das zu schwammig ist kannst du die ja auch noch in eine vielsagendere Exception umwandeln.
 
Zuletzt bearbeitet:

GhostfaceChilla

Bekanntes Mitglied
Danke , darauf hätte ich auch selbst kommen können:oops:
Hätte nur noch eine Frage:
Und zwar ich habe die keys vorher von meiner Fernbedienung ausgelesen und habe die Daten in einem byte[] gespeichert. Jetzt habe ich ja Werte wie "03" und "09" drin. D.h der Compiler wird diese ja als Oktalwerte ansehen. Jetzt weis ich nicht, wie die 09 vorher beim auslesen zustande kam. Sie müsste ja ein byte representieren. Wie handle ich das? Der Code würde ja so oder so wegen der "09" nicht funktionieren. Aber muss mich sowieso erstmal in enum ein bisschen reinlesen, allein schon wie man das hinbekommt das man "Unterklassen" des Enums aufbauen kann. Also das z.B. Power, Music, etc. als Keys Objekt angesehen wird. Bzw., ich glaube das wäre kein guter Stil.

-GhostfaceChilla-
 
Zuletzt bearbeitet:

GhostfaceChilla

Bekanntes Mitglied
So, habe jetzt mal die Enum Klasse umgewandelt um die Klassenhierarchie zu verwirklichen:

Java:
public enum Keys {

    //Bytecode für die verschiedenen Tasten
    POWER(new Power(), new byte[]{4,1});
    //Direkt Zugriff aus Musi,Spiele,Gallerie und Videos
    /*
    MUSIC(2, 5, 0, 4, 0, 0, 0, 0, 2, 5, 0, 30, 0, 0, 0, 0),
    GAME(2, 5, 0, 5, 0, 0, 0, 0, 2, 5, 0, 31, 0, 0, 0, 0),
    GALLERY(2, 5, 0, 6, 0, 0, 0, 0, 2, 5, 0, 32, 0, 0, 0, 0),
    VIDEO(2, 5, 0, 7, 0, 0, 0, 0, 2, 5, 0, 33, 0, 0, 0, 0),
    //Steurung für Film und Musik
    BEFORE(3, -74, 0x09),
    BEFORE2(2, 0, 0, 0, 0, 0, 0, 0, 03, -74, 0),
    NEXT(3, -75, 0),
    NEXT2(2, 0, 0, 0, 0, 0, 0, 0, 03, -75, 0),
    BACKWARD(3, -53, 0),
    BACKWARD2(2, 0, 0, 0, 0, 0, 0, 0, 03, -53, 0),
    FORWARD(3, -54, 0),
    FORWARD2(2, 0, 0, 0, 0, 0, 0, 0, 03, -54, 0),
    PLAY(3, -51),
    PLAY2(2, 0, 0, 0, 0, 0, 0, 0, 03, -51, 0),
    STOP(3, -73, 0),
    STOP2(2, 0, 0, 0, 0, 0, 0, 0, 03, -73, 0),
    //Nummernfeld und Navigation durch das Menü
    NUMBER_ONE(2, 0, 0, 43, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
    UP(2, 0, 0, 82, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
    NUMBER_THREE(2, -128, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
    LEFT(2, 0, 0, 80, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
    ENTER(2, 0, 0, 40, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
    RIGHT(2, 0, 0, 79, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
    NUMBER_SEVEN(2, 1, 0, 18, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
    DOWN(2, 0, 0, 81, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
    ESCAPE(2, 0, 0, 41, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
    ZERO(2, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 43, 0, 0, 0, 0),
    //Lautstärkeregelung
    VOL_UP(3, -23, 0),
    VOL_DOWN(3, -22, 0),
    MUTE(3, -30, 0);
 */
    
    private byte bytes[];// Repräsentiert den Key
    private Key k;
    
    private Keys(Key key, byte...  bytes){
        this.bytes = bytes;
        this.k = key;
    }
    
    public static Key getKey(byte[] bytes){
    for(Keys key: values()){
      if(Arrays.equals(key.getBytes(), bytes)){
        return key.k;
      } 
    }
        return null;
    }
    
    public byte[] getBytes(){
        return this.bytes;
    }
    
    public Key getKey(){
        return this.k;
    }
}

Die Enum Klasse Keys, hier habe ich es so geregelt, das mir bei der getKey Methode eine Unterklasse der Abstrakten Klasse Key liefert.Ich hoffe das das so ok ist.

Java:
@Override
    public void dataEventOccurred(UsbPipeDataEvent upde) {
        Key k = Keys.getKey(upde.getData());
        System.out.println(k); //Nur zum Test, hier könnte man dann k.call() machen um die Aktion aufzurufen
        
    }

Und diese Aktion reicht um die Tasten Aktion auszuführen.

Also funktioniert einwandfrei, habe zu Testzwecken jeder Key Klasse einen Namen als Attribut mitgegeben.

-GhostfaceChilla-
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Ja, sieht doch schon gut aus. Ein paar Sachen würde ich noch ändern:

Alle Instanzen der Klasse "Key" sollten alle Daten und das Verhalten ihres Keys beeinhalten, damit du pro Key nur eine Klasse hast. Im Moment hast du die Byte-Folge noch im enum, das Verhalten aber in der Klasse. Das würde ich zusammenlegen:

Java:
public abstract class Key {
  private byte[] bytes;

  protected Key(int...bytes){//int... als argumente für übersichtlichen Code
    byte[] temp = new byte[bytes.length];
    for(int i =0; i<bytes.length;i++) temp[i] = bytes[i];
    this.bytes = temp;
  }

  public byte[] getBytes(){return bytes;} //Evtl. Kopie anlegen, da byte-array von außen manipuliert werden könnte?

  public void abstract call();
}

public class Power extends Key{
  
  public Power(){
    super(4,1); // Power kennt sein byte-array
  }

  //...

Im enum sieht das dann so aus:
Java:
public enum Keys{
  POWER(new Power()),

  private Key key;

  private(Key key){
    this.key = key;
  }

  public Key getKey(){return key;}

  public byte[] getBytes(){return key.getBytes();}
Somit hast du alles Key-Spezifische in der jeweiligen Klasse und das Enum verwaltet die Instanzen für dich.

Kleine Falle ist noch drinn:
Java:
public static Key getKey(byte[] bytes){
    for(Keys key: values()){
      if(Arrays.equals(key.getBytes(), bytes)){
        return key.k;
      }
    }
        return null; //NPE!
Ich würde dir empfehlen einen Key "Noop" anzulegen, der in seiner "call()"-methode nichts macht (eben no-operation). Diesen gibts du dann statt "null" zurück (Dieses Vorgehen nennt sich NullObject-Pattern).
Die Alternative ist, dass du immer auf "null" prüfen musst, wenn du einen Key ermittelst. Was den Code in meinen Augen aufbläst. Daher würde ich einfach einen "leeren" Key zurückgeben, der einfach nichts macht. Der Code sähe dann so aus:
Java:
public static Key getKey(byte[] bytes){
    for(Keys key: values()){
      if(Arrays.equals(key.getBytes(), bytes)){
        return key.k;
      }
    }
        return NOOP; // Key, der nichts tut.
 
Zuletzt bearbeitet:

GhostfaceChilla

Bekanntes Mitglied
Vielen dank :)
Jetzt habe ich nur noch das Problem, das die "03" laut meinem Compiler ein zu großer Wert ist. Ich weis aber nicht wie das jetzt ändern kann. Ich habe ja mit einem Testprogramm die Keys ausgelsen und da wurde das byte als "03" dargestellt. Wie kann ich das handeln??ich kann ja nicht aus 03 3 machen...

-GhostfaceChilla-
 

Natac

Bekanntes Mitglied
Zeig mal bitte die Codezeilen, wo das auftritt. Gerade 03 passt eigentlich in jeden Datentyp (sollte es zumindest :autsch: )
 

GhostfaceChilla

Bekanntes Mitglied
Huh, der Fehler ist weg ???:L
Ok, naja vielleicht hatte ich an anderer Stelle im Code nen Fehler. Egal es klappt alless :) Vielen Dank für die viele Hilfe, der Code sieht um einiges besser aus als vorher und lässt sich auch leicchter bearbeiten.
Vielen dank.

-GhostfaceChilla-
 

GhostfaceChilla

Bekanntes Mitglied
So, habe jetzt mal weiter programmiert und es hat sich mir noch eine Frage erschlossen.
Folgendes Szenario:
Man drückt die "rechts" Taste auf der Fernbedienung, nun wir die Taste erkannt die jeweilige Klasse dazu aufgerufen und nun muss die Aktion kommen, das nächste, rechte Element der View zu fokusieren.
Das Problem:
Ich muss erst einmal alle Elemente der aktuellen View in eine ObservableList speichern, dann das aktuell fokusierte erfragen und dann, wenn möglich das nächste Element fokusieren. Das Problem hierbei, da ein Model weder seine View noch seinen Controller kennen sollte, kann ich ja nicht das aktuelle Controller Objekt nach der Liste der vorhandenen Viewelemente fragen. Oder könnte ich das doch machen,zählt eein Key Objekt überhaupt als Model im Sinne von MVC?Also rein vom Programmierstil her, möglich wäre es ja. Oder würde man eher hingehen und den Controller die "rechtsklick" Aktion durchführen lassen?Aber dann müsste ich ja auch auf den Controller vom Model her zugreifen. Vielleicht gibts ja auch noch ne andere Lösung die ich gar nicht beachtet habe :D
Vielen dank schonmal für eure Hilfe.

-GhostfaceChilla-
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Welches Programmdesign? Allgemeine Java-Themen 6
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Frage regex greater than less than Allgemeine Java-Themen 7
berserkerdq2 Frage zu IntelliJ und JavaFX Allgemeine Java-Themen 1
W Timer Konzept-Frage Allgemeine Java-Themen 16
T Eine Frage des Designs Allgemeine Java-Themen 2
C Frage zu eigenem TableCellRenderer Allgemeine Java-Themen 11
C Programmvorstellung & Frage zum Thema Geschäftsform Allgemeine Java-Themen 51
J Frage zu System.getproperties. Allgemeine Java-Themen 60
molat100 wie kann man die Frage beantworten Allgemeine Java-Themen 1
pkm Frage zur Präzision von Calendar.WEEK_OF_YEAR Allgemeine Java-Themen 12
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
F Frage zu System.in Allgemeine Java-Themen 3
marcooooo Frage zum Beispiel im Anhang Allgemeine Java-Themen 16
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
B For-Loop Frage Allgemeine Java-Themen 21
L Java frage Allgemeine Java-Themen 3
bueseb84 Frage zu Mock und UpperBound Allgemeine Java-Themen 2
M Frage zum Konstruktor Allgemeine Java-Themen 2
W Best Practice Frage zur Umsetzung MVC Allgemeine Java-Themen 9
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
B Frage zu Unit-Tests Allgemeine Java-Themen 6
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
R Allgemeine Frage zu RMI bei MVC Allgemeine Java-Themen 2
O Frage zum Runtimeverhalten von Java ... Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
D Frage zu Vererbung Allgemeine Java-Themen 5
J Frage zu regulärem Ausdruck Allgemeine Java-Themen 2
M Allgemeine Frage: Wie lernt man Java / Programmieren von Grund auf? Allgemeine Java-Themen 7
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Frage zur JLS Allgemeine Java-Themen 0
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
A Methoden Allgemeine Java Frage Allgemeine Java-Themen 3
E String Frage Allgemeine Java-Themen 9
I bin neu bei GitHub, Frage zur Sicherheit Allgemeine Java-Themen 14
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
C KeyListener Frage Allgemeine Java-Themen 3
T Frage zu UML in Java programmieren Allgemeine Java-Themen 1
R Konstanten initialisieren - FRAGE Allgemeine Java-Themen 3
MTJ004 FTP Frage zu FTP Speicherung Java-Android-FTP Allgemeine Java-Themen 5
J Frage zum Entwurf / json-Datenmodell Allgemeine Java-Themen 8
A Frage zu meinem Code Allgemeine Java-Themen 2
RalleYTN Classpath Nur ne kleine Frage zur MANIFEST.MF Allgemeine Java-Themen 4
T Frage zu Access Modifiers Allgemeine Java-Themen 6
W Input/Output Frage zu pdfbox und FileUtils Allgemeine Java-Themen 2
O Frage zur Implementierungsweise Allgemeine Java-Themen 4
B Frage zu Bitshift Allgemeine Java-Themen 3
J Java Zufallsgenerator (6 aus 49) Frage Allgemeine Java-Themen 7
L Frage zu RIA und GWT Allgemeine Java-Themen 0
P Concurrency Frage Allgemeine Java-Themen 8
M Frage zu Enumerations Allgemeine Java-Themen 2
F Unlimited Strength Policy. Frage Verbreitung der Anwendung Allgemeine Java-Themen 1
F Frage zur Library JTS Allgemeine Java-Themen 5
S Java Design Frage Allgemeine Java-Themen 10
E Reflection? Frage Allgemeine Java-Themen 4
C FileInputStream frage Allgemeine Java-Themen 6
Uzi21 Frage zu NetBeans ( Console) Allgemeine Java-Themen 11
D Classpath Frage zum Java Resource Loading Allgemeine Java-Themen 2
G Frage zu JPA Allgemeine Java-Themen 1
S Methoden Frage Allgemeine Java-Themen 2
P MVC - Frage zu Model Allgemeine Java-Themen 4
K Frage zu Locks Allgemeine Java-Themen 1
S Frage zu abstract Allgemeine Java-Themen 5
M ArrayList<String> Frage Allgemeine Java-Themen 7
M OOP Design Frage Allgemeine Java-Themen 2
N Frage zur while-Schleife Allgemeine Java-Themen 18
T Best Practice Auslesen von Zeichenketten (Frage, Antworten, usw) Allgemeine Java-Themen 4
C Eine Frage zur Bearbeitungszeit Allgemeine Java-Themen 8
H Frage wegen Heap-Speicher Allgemeine Java-Themen 2
T Garbage Collection Frage Allgemeine Java-Themen 15
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
D Frage zu Java und Umlauten / charsets Allgemeine Java-Themen 2
B Frage zu Java und OpenGL? Allgemeine Java-Themen 3
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
A eine test thread.join() frage Allgemeine Java-Themen 2
DStrohma LayoutManager Frage zum GridBagLayout Allgemeine Java-Themen 4
F Frage zu Regex möglich Allgemeine Java-Themen 4
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
D Frage und Antwort Programm, Problem bei Methodenaufruf Allgemeine Java-Themen 3
J NetBeans Frage bezüglich der Scanner-Klasse Allgemeine Java-Themen 6
H Java Vector Frage Allgemeine Java-Themen 9
W Frage... Allgemeine Java-Themen 29
R Frage zur topologischen Sortierung Allgemeine Java-Themen 2
H Frage zu weka.core.Instance Allgemeine Java-Themen 3
Y Kleine Frage zu String.split Allgemeine Java-Themen 3
T Frage zu Klassendesing Allgemeine Java-Themen 3
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
C Eclipse Wichtige frage Allgemeine Java-Themen 5
H Frage zu java.weka.core.Instances Allgemeine Java-Themen 3
S Frage zu Format Modifiers in Log4j Allgemeine Java-Themen 11
H Frage zu clone() Allgemeine Java-Themen 5
4 Simple(?) Frage zu Threads Allgemeine Java-Themen 14
H2SO3- SCJP Chapter 3 Frage 10. Falsche Antwort? Allgemeine Java-Themen 15
H Frage sinnvolle Datenspeicherung und -verarbeitung Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben