Hilfe bei Programm. IDE: Eclipse mit EV3-Plugin, lejos

timm4444

Mitglied
Hallo, ich programmiere noch nicht lange mit Java und lejos. Ich bin dabei mein erstes Programm immer weiter zu verbessern und vergrößern, komme jetzt aber nicht mehr weiter. Ich möchte , dass ich über den Befehl:
Java:
LCD.drawString(ColorSensor.ColorName, 0, 6);
den Name der erkannten Farbe aufs LCD schreiben kann. Dazu habe ich folgenden Code:
Java:
package de.lejos.fwk.sensor;

import lejos.hardware.port.Port;
import lejos.hardware.port.SensorPort;
import lejos.hardware.port.UARTPort;
import lejos.hardware.sensor.EV3ColorSensor;
import lejos.robotics.Color;


public class ColorSensor extends EV3ColorSensor {

    public final static Port DEFAULT_COLOR_SENSOR_PORT = SensorPort.S1;

    public ColorSensor(UARTPort port) {
        super(port);
    }

    public ColorSensor(Port port) {
        super(port);
    }

    public ColorSensor() {
        super(DEFAULT_COLOR_SENSOR_PORT);
    }


    
    public static String ColorName = "ERROR";
    
    public void ColorName2() {
        ColorName = "ERROR2";
        while (true) {
            switch (getColorID()) {
            case Color.WHITE:
                ColorName = "Weiß";
                return;
                
            case Color.YELLOW:
                ColorName = "Gelb";
                return;
                
            case Color.GREEN:
                ColorName = "Grün";
                return;
                
            case Color.BROWN:
                ColorName = "Braun";
                return;
                
            case Color.BLUE:
                ColorName = "Blau";
                return;
                
            case Color.RED:
                ColorName = "Rot";
                return;
                
            case Color.BLACK:
                ColorName = "Schwarz";
                return;
            }
        }
    }
}
Aber es wird dann immer "ERROR" angezeigt. Nicht mal "ERROR2". D.h. es wird der Teil wo die Farbe erkannt wird, wird nicht ausgeführt, oder? Ich glaube schon.
Ich weiß ich könnte die switch abfrage auch in die Hauptdatei packen, jedoch möchte ich, das die Abfrage in einer zweiten Datei ausgeführt wird.
Soll ich vielleicht anstatt der Switch abfrage if und elif Abfragen machen? Ich probiere das mal aus, bis ich hier eine Antwort bekomme.

(Das ist keine Hausaufgabe oder so, sondern mein eigenes Projekt)

Danke schonmal im vorraus.
 
Beste Antwort
main (die Methode public static void main) ist der Programmeinstiegspunkt, d. h. die erste Methode, die von der JVM aufgerufen wird. Insofern erübrigt sich die Frage, wie man ohne/vor main etwas ausführen kann. Kann natürlich sein, dass das Framework noch ein Main-Klasse kennt oder bestimmte andere Methoden benötigt, da ich es nicht kenne, kann ich dazu aber nichts sagen.

Ansonsten leitest Du ja von EV3ColorSensor ab. Daher brauchst Du bei getColorId() keine Referenz anzugeben (was implizit zu this.getColorId() führt).

Allerdings sehe ich keinen Grund, die Klasse EV3ColorSensor zu erweitern. Alles, was Du willst, ist eine Klasse, die einen EV3ColorSensor auslesen und den Namen der Farbe zurückgeben kann.

Java:
public class ColorSensor...
EDIT: Ich bekomme die if abfrage nicht hin. Ich habe so etwas versucht:
Java:
public String getName() {
        if (ColorSensor.getColorID() == Color.RED) {
            return "ROT";
        }
        
        
    }
Habe dann aber immer nur:
Java:
Cannot make a static reference to the non-static method getColorID() from the type EV3ColorSensor

Ich habe jetzt nul Ahnung mehr, was ich machen könnte. 😭
 
EDIT2: Sehr wilkommen!

Ich habe jetzt mein Programm erweitert und möchte folgenden Codeteil:
Java:
    public static String colorName() {
  
        String ColorName = "ERROR";
        switch (colorSensor.getColorID()) {
        case Color.BLACK:
            ColorName = "Schwarz";  //
            break;
        case Color.BLUE:
            ColorName = "Blau";  //
            break;
        case Color.BROWN:
            ColorName = "Braun";  //
            break;
        case Color.GREEN:
            ColorName = "Gruen";  //
            break;
        case Color.NONE:
            ColorName = "Keine Farbe";  //
            break;
        case Color.RED:
            ColorName = "Rot";  //
            break;
        case Color.WHITE:
            ColorName = "white";  //
            break;
        case Color.YELLOW:
            ColorName = "Gelb";  //
            break;
        default:
            ColorName = "Keine Farbe";
            break;
        }
        return ColorName;
        }
entweder als Unterprogramm haben oder in einer anderen Datei(Klasse). Ich habe es zwar schon als Unterprogramm geschrieben, jedoch muss ich vorher den Farbsensor initalisieren und möchte dabei etwas auf dem Bildschirm anzeigen lassen. Ich kann jedoch nichts vor dem Main-Aufruf auf dem LCD Display anzeigen lassen
Wenn mir jemand sagen kann, wie das geht(vor dem Main-Aufruf etwas anzeigen zu lassen oder den Farbsensor nicht im Unterprogramm initalisieren zu müssen), brauche ich das nicht in einer anderen Klasse.
 
Zuletzt bearbeitet:
Vielleicht anders formuliert:
Kann ich z.B. "motorB.close" in einem Unterprogramm nutzten, ohne diesem im Unterprogramm zu Initalisieren?
(Er wird intalisiert bevor das Unterprogramm aufgerufen wird)
 
Zuletzt bearbeitet:
main (die Methode public static void main) ist der Programmeinstiegspunkt, d. h. die erste Methode, die von der JVM aufgerufen wird. Insofern erübrigt sich die Frage, wie man ohne/vor main etwas ausführen kann. Kann natürlich sein, dass das Framework noch ein Main-Klasse kennt oder bestimmte andere Methoden benötigt, da ich es nicht kenne, kann ich dazu aber nichts sagen.

Ansonsten leitest Du ja von EV3ColorSensor ab. Daher brauchst Du bei getColorId() keine Referenz anzugeben (was implizit zu this.getColorId() führt).

Allerdings sehe ich keinen Grund, die Klasse EV3ColorSensor zu erweitern. Alles, was Du willst, ist eine Klasse, die einen EV3ColorSensor auslesen und den Namen der Farbe zurückgeben kann.

Java:
public class ColorSensor {
    private final EV3ColorSensor sensor;
    private String color = "Nichts erkannt";

    public ColorSensor(EV3ColorSensor sensor) {
        this.sensor = sensor;
    }

    public String getDetectedColor() {
        return color;
    }

    public void detectColor() {
        switch (sensor.getColorId()) {
            case Color.BLUE: color = "blau"; break;
            case Color.RED: color = "red"; break;
            // usw.
            default: color = "Nichts erkannt";
        }
    }
}

Dem ColorSensor kannst Du bei seiner Erzeugung einen EV3ColorSensor übergeben, der beim Aufrufer initialisiert wird.
 
Beste Antwort
Meeeega, danke.🙂🙂🙂🙂
Genau was ich gesucht habe.

Zu deiner Frage, warum ich das mache, ist, dass man(soweit ich weiß) nur die Zahl der Farbe bekommt(oder nicht?🤔), aber ich den genauen Namen möchte, da der auf dem LCD angezeigt werden soll.
 

Zurück
Oben