Keyboard Input ohne Enter

Kirby.exe

Top Contributor
Gibt es einen Weg Input von der Tastatur zu lesen und Enter zu drücken, wie z.B. beim BufferedReader? Es gibt in Swing the KeyListener, jedoch funktioniert der nach meinem Wissen nicht in der Kommandozeile. Natürlich könnte ich ein GUI basteln, jedoch würde es mich interessieren ob es auch eine Alternative gibt 🙂
 
Also nochmal bezogen auf meine Frage, ich möchte halt dass Eingaben im Terminal per Tastatur eingelesen werden ohne Enter zu drücken. Beispielsweise wenn die Shift Taste 4 Sekunden gehalten wurde, wird eine Variable auf 100% gesetz(double wert) 🙂
 
Hier die brutale Variante:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;

public class Test {

    public static void main(String[] args) throws Exception {
        Toolkit.getDefaultToolkit().addAWTEventListener(
            e -> System.out.println(e),
            AWTEvent.KEY_EVENT_MASK);
        JFrame frame = new JFrame("");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}
 
Hier die brutale Variante:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;

public class Test {

    public static void main(String[] args) throws Exception {
        Toolkit.getDefaultToolkit().addAWTEventListener(
            e -> System.out.println(e),
            AWTEvent.KEY_EVENT_MASK);
        JFrame frame = new JFrame("");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}
Und wenn ich jetzt nur Dinge einlesen möchte, wenn ein Knopf vorher gedrückt wurde? XD
 
Hier die brutale Variante:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;

public class Test {

    public static void main(String[] args) throws Exception {
        Toolkit.getDefaultToolkit().addAWTEventListener(
            e -> System.out.println(e),
            AWTEvent.KEY_EVENT_MASK);
        JFrame frame = new JFrame("");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}
Fehlt da nicht noch etwas xD das sieht so kurz aus...
 
Also der Code ist seeeeehr seeeeehr hacky aber so hatte ich es jetzt eingefügt, jedoch würde ich den Listender gerne bei erneutem drücken deaktivieren 🙂

Java:
JButton btnStartstop = new JButton("Start/Stop");
        btnStartstop.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(ignition) {
                    ignition = false;
                }else {
                    ignition = true;
                    Toolkit.getDefaultToolkit().addAWTEventListener(
                            x -> System.out.println(x),
                            AWTEvent.KEY_EVENT_MASK);
                }
            }
        });
        btnStartstop.setBounds(291, 35, 117, 29);
        frame.getContentPane().add(btnStartstop);
 
Also der Code ist seeeeehr seeeeehr hacky aber so hatte ich es jetzt eingefügt, jedoch würde ich den Listender gerne bei erneutem drücken deaktivieren 🙂

Java:
public class Test {

    public static void main(String[] args) throws Exception {
        AWTEventListener listener = e -> System.out.println(e);
        JFrame frame = new JFrame("");
        JButton button = new JButton("Start/Stop");
        AtomicBoolean active = new AtomicBoolean();
        button.addActionListener(e -> {
            if (active.getAndSet(!active.get()))
                Toolkit.getDefaultToolkit().addAWTEventListener(
                        listener, AWTEvent.KEY_EVENT_MASK);
            else
                Toolkit.getDefaultToolkit().removeAWTEventListener(
                        listener);
        });
        frame.add(button);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}
 
Also ich muss gestehen der Key Listender confused mich etwas xD Ich möchte eigentlich nur den "Namen" der Taste haben xD Also als Char oder String, relativ egal 🙂
 
Beispiel:
Java:
// andere imports ...
import static java.awt.event.KeyEvent.KEY_PRESSED;
import static java.awt.event.KeyEvent.KEY_RELEASED;

public class Test {

    private static void handle(KeyEvent e) {
        if (e.getID() != KEY_PRESSED && e.getID() != KEY_RELEASED) {
            return;
        }
        String action = e.getID() == KEY_PRESSED ? "Pressed " : "Released ";
        System.out.println(action + e.getKeyText(e.getKeyCode()));
    }

    public static void main(String[] args) throws Exception {
        AWTEventListener listener = e -> handle((KeyEvent) e);
}
Wichtig: https://docs.oracle.com/javase/8/docs/api/java/awt/event/KeyEvent.html
 
Gut dass in Auto Infotainment Systemen kein Java läuft xD
Elektrobit https://www.elektrobit.com ist einer der Weltmarktführer für Infotainmentsysteme im Auto (Audi, BMW, Medion, etc). Entwickelt werden diese Großteils in Java. Zumindest war das der Stand vor 8 Jahren, als ich in dem Projekt involviert war. Harte Echtzeitanforderungen existieren in einem Infotainment System auch eher weniger...
 
Beispiel:
Java:
// andere imports ...
import static java.awt.event.KeyEvent.KEY_PRESSED;
import static java.awt.event.KeyEvent.KEY_RELEASED;

public class Test {

    private static void handle(KeyEvent e) {
        if (e.getID() != KEY_PRESSED && e.getID() != KEY_RELEASED) {
            return;
        }
        String action = e.getID() == KEY_PRESSED ? "Pressed " : "Released ";
        System.out.println(action + e.getKeyText(e.getKeyCode()));
    }

    public static void main(String[] args) throws Exception {
        AWTEventListener listener = e -> handle((KeyEvent) e);
}
Wichtig: https://docs.oracle.com/javase/8/docs/api/java/awt/event/KeyEvent.html
Dankeschön 🙂 ich werde es mir mal in ruhe durchlesen 🙂
 
Elektrobit https://www.elektrobit.com ist einer der Weltmarktführer für Infotainmentsysteme im Auto (Audi, BMW, Medion, etc). Entwickelt werden diese Großteils in Java. Zumindest war das der Stand vor 8 Jahren, als ich in dem Projekt involviert war. Harte Echtzeitanforderungen existieren in einem Infotainment System auch eher weniger...
Ich hatte da mal eine Frage, sind nicht Verkehrmeldungen und Umleitung des Navis Echtzeitanforderungen? Wie handled Java das oder wird das ist eine anderen Sprache programmiert und eingebunden?
 
Also ich hatte nicht nur ans Auto Infotainment System gedacht, sondern zum Beispiel auch die Bilderkennung des aktuellen Verkehrsraums... Diese MUSS schnelle, harte Echtzeitanwendungsanforderungen erfüllen; die aber normalerweise nicht in Java, sondern mit einer hardwarenahen Sprache wie C/C++ umgesetzt wird. Also ich handhabe das so, dass ich "den Kern" der Bilderkennung immer aus Java in andere Sprachen auslagere. Anstatt 1 Sekunde braucht der Spaß dann nur noch 50ms zum Beispiel.
 

Zurück
Oben