Haben Chars wirklich keine KeyCodes?

JavaMeetsBlueJ

Bekanntes Mitglied
Hallo Java-Forum, nach ca. einem Monat Java-Pause hab ich heute wieder angefangen ein bischen zu coden und bin dabei auf die Klasse Robot gestoßen. Ich möchte Aus einer TextArea den String in einem Char-Array speichern, was auch tadellos funktioniert. Danach wird 5 Sekunden gewartet, solange hat der Benutzer Zeit, den Courser auf ein beliebiges Eingabefeld zu setzen, bis der Roboter losschreibt. das funktioniert aber nur solangg, wie es sich bei der Eingabe um Zahlen handelt. Wie kann ich mein Vorhaben auch mit Text umsetzen? Hier mal ein paar Zeilen Code:

Java:
import java.awt.AWTException;


public class Logik {

	static char[] inhalt ;
	
	public static void schreibeStringInArry(Gui fenster)
	{
		inhalt = fenster.eingaben.getText().toCharArray();
	}
	
	public static void schreiben() throws AWTException
	{
		Roboter robot = new Roboter();
		
		robot.delay(5000);
		for(int i = 0; i < inhalt.length; i++)
	    {
			
			robot.keyPress(inhalt[i].getKeyCode()); // hier gibt's eine Exception sobald ich dort einen Buchstaben habe und keine Zahl.VK_XY geht hier ja schlecht.
			
		}
	}
}

MfG
 

JavaMeetsBlueJ

Bekanntes Mitglied
Also mit der Methode getKeyCode geht's erst garnicht, weil die Methode angeblich nicht für Chars genutzt werden kann. Wenn ich die Methode weglasse, dann gibt es MANCHMAL unbgefähr sowas: IllegalArgumentException: Illegal KeyCode (irgendwie sowas-> dafür gibt es dann wohl keinen KeyCode)
MfG
 

haui95

Bekanntes Mitglied
Okay,

hast du schon einmal versucht dein Char in ein Integer zu typecasten ?

Java:
char c = 'c';
int figure = (int) c;
r.keyPress(figure);


Ausgabe ist gleich 2 anstatt 99, da zwei der Keycode für 'C' bzw. 'c' ist.

Java:
        for(int i = 0; i < inhalt.length; i++) {
            char figure = inhalt[i];
            int value = (int) figure;
            robot.keyPress(value);
        }

MfG

Hauke ;-)
 
Zuletzt bearbeitet:
T

ThisIsJaavaaa

Gast
Java:
    // java.awt.event.KeyEvent

    /**
     * Returns an extended key code for a unicode character.
     *
     * @return for a unicode character with a corresponding {@code VK_} constant -- this
     *   {@code VK_} constant; for a character appearing on the primary
     *   level of a known keyboard layout -- a unique integer.
     *   If a character does not appear on the primary level of a known keyboard,
     *   {@code VK_UNDEFINED} is returned.
     *
     * @since 1.7
     *
     */
    public static int getExtendedKeyCodeForChar(int c) {
        // Return a keycode (if any) associated with a character.
        return sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(c);
    }

Java:
sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(int)
[code=Java]

geht aber erst ab java 1.7
 
B

Beni

Gast
In solchen Fällen sollte man immer nachlesen, was die Methode die man aufruft genau macht - und welche Argumente sie erwartet.

Dann erfährt man nämlich, dass "keyPress" nicht einen Character erwartet, sondern eine der Konstanten die in KeyEvent definiert sind. Aus der API:
keycode - Key to press (e.g. KeyEvent.VK_A)

Wie man einen char in einen key-code wandelt, weiss ich auch nicht auswendig. Aber google hilft da sicher weiter, vielleicht kann auch die Klasse KeyStroke helfen.
 

Mujahiddin

Top Contributor
Ich glaube, was du versuchst, ist etwas schwieriger.
Du willst also, dass der Robot jedes Zeichen des Char-Arrays eingibt?
Leider ist es bei KeyCodes so, dass nicht zwischen Groß- und Kleinschreibung unterschieden wird. Also musst du eine extra Anfrage durchführen. Übrigens darfst du nicht vergessen, die Keys im Nachhinein zu Releasen.

Folgendermaßen stell ich's mir vor:

Java:
for(char c : inhalt) {
	int code = KeyEvent.getExtendedKeyCodeForChar(c);
	if(Character.isUpperCase(c)) {
		r.keyPress(KeyEvent.VK_SHIFT);
		r.keyPress(code);
		r.keyRelease(KeyEvent.VK_SHIFT);
	}
	else
		r.keyPress(code);
	r.keyRelease(code);
}
 
Zuletzt bearbeitet:
D

dfgpnh

Gast
Bei mir kommt da exakt das gleiche raus wie vorher :(. Was mich noch interessiert: Ich hab das ganze ja in ner GUI. solange der Rechner wartet bzw. arbeitet, wir der "Auf geht's " Button nicht released. Wie verhindert man das?
 

Mujahiddin

Top Contributor
Das verhindert man, indem man es in einen anderen Thread auslagert.

also statt
Java:
Logik.schreiben();
eher
Java:
new Thread(new Runnable() {
    @Override
    public void run() {
        Logik.schreiben();
    }
}).start();

Hast du meins ausprobiert?
Statt
Code:
getExtendedKeyCodeForChar(c);
kannst du auch
Code:
Integer.valueOf(Character.toUpperCase(c));
machen.
 

haui95

Bekanntes Mitglied
So ginge es vielleicht auch noch ganz einfach:

Java:
private void type(Robot r, String str) {
        char[] figures = str.toCharArray();
        int i = figures.length;
        int j = 0;
        while (j<i) {
                int keycode = (int) figures[j] - 32;
                r.keyPress(keycode);
                r.keyRelease(keycode);
                j++;
        }               
}
 

JavaMeetsBlueJ

Bekanntes Mitglied
Ups dass da soviele Kommentare sind hab ich garnicht gesehn. Den Gast-Post bitte ignorieren:).

Das releasen habe ich selber auch bemerkt, danke trotzdem. Dass Key-Codes Integers sind wusste ich vorher schon durch die API. Diese VK_XY sind ja Integers. Deshalb dachte ich, dass es so einfach geht wie z-B so:
Java:
'c'.getKeyCode()
So einfach ist es ja anscheinend nicht.

Mujahiddin's Post geht schon in die richtige Richtung. Ausprobieren tu ich's morgen, ist langsam Zeit für's Bettchen;) Danke aber schonmal für alle Beiträge.

Morgen wird wohl der komplette Code hierein kommen, das Design ist sehr schlecht, aber vielleicht kann mir daran jemand erklären, wieso ein #Button, der ein Event auslöst solange nicht "released" wie eine Aktion ausgeführt wird, auf die der Button einfluss hat(z.B Berechnungen oder halt das warten mit delay() )

MfG
 

Mujahiddin

Top Contributor
Primitive Datentypen sind keine Klassen, deshalb sind für sie auch keine Methoden definiert.
Du müsstest diese in ihre Wrapperklassen boxen, bei [c]int[/code] zum Beispiel über
Code:
Integer i = 3;
oder noch sauberer
Code:
Integer i = Integer.valueOf(3);
Für diese Klasse sind wiederum Methoden definiert, die du verwenden kannst.
Um den KeyCode eines chars herauszufinden, habe ich dir ja bereits zwei möglichen Methoden gezeigt.

Wenn du eine GUI hast und einen Button betätigst, wird dies über den EDT gehandhabt. Also alle ActionListener, für die dieser Button angemeldet ist, werden direkt vom EDT durchgeführt (es gibt nur einen). Dieser führt all den Code aus und sobald er fertig ist, ist die Oberfläche wieder bereit, Events wahrzunehmen. Meistens geht das innerhalb von Millisekunden, also wird das nicht bemerkt. Einen Robot müsstest du in einen anderen Thread verlagern, falls er viel Zeit in Anspruch nimmt (und das tut er ja). Somit kann der EDT getrost weiter seine Arbeit machen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
TheSepp Nur Arrays ausgeben, die Werte zugewiesen haben. Java Basics - Anfänger-Themen 4
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
J Kreis soll die gleiche Fläche wie das Rechteck haben wie mache ich das? Java Basics - Anfänger-Themen 3
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
M Erste Schritte Neuen Frame nur einmal offen haben Java Basics - Anfänger-Themen 6
K Methoden mit den Namen accept. Welche Funktion haben diese? Java Basics - Anfänger-Themen 2
K Welchen Typ haben Variablen in Default-Methoden und in statischen Methoden in Schnittstellen? Java Basics - Anfänger-Themen 4
Z Was habe ich davon mit einem Datentyp verschiedene Instanzen zu haben? Java Basics - Anfänger-Themen 6
N Objektvariablen haben den gleichen Wert - warum? Java Basics - Anfänger-Themen 5
T Wenn Schaltjahr ist, soll Februar, einen Tag mehr haben, GUI mit combobox Java Basics - Anfänger-Themen 4
B Warum haben Java Programme ein anderes Design? Java Basics - Anfänger-Themen 5
J Wie behalten Variablen den Wert, den sie in einer anderen Methode erhalten haben? Java Basics - Anfänger-Themen 14
M Class will alle Variablen als static haben Java Basics - Anfänger-Themen 11
T Doublezahlen haben ein E Java Basics - Anfänger-Themen 12
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
B Was für Aufgaben haben die einzelne Entwurfsmuster? Java Basics - Anfänger-Themen 9
E BlockChallenge: Klötze haben keinen anschlag Java Basics - Anfänger-Themen 10
E Object als Parameter das Unbekannt ist, aber ein bestimmtes Interface haben muss Java Basics - Anfänger-Themen 3
M möchte in konstrukturaufruf eine bedingte anweisung haben. Java Basics - Anfänger-Themen 6
T Variablen haben null Wert in try-Anweisung Java Basics - Anfänger-Themen 4
L Array von Buttons, jeder soll MouseListener haben Java Basics - Anfänger-Themen 5
D Welchen Namen darf ein Konstruktor haben? Java Basics - Anfänger-Themen 6
M Warum können innere Klassen keine static-members haben? Java Basics - Anfänger-Themen 2
P Program funktioniert nur bei Rechner die jdk haben Java Basics - Anfänger-Themen 4
S Welche Bedeutung haben diese Wörter? Java Basics - Anfänger-Themen 2
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
S Chars vergleichen ohne Betrachtung der Groß und Kleinschreibung Java Basics - Anfänger-Themen 7
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
J erstes Vorkommen eines Chars aus einem String entfernen Java Basics - Anfänger-Themen 3
J erstes Vorkommen eines chars entfernen Java Basics - Anfänger-Themen 1
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
J String Methode chars() Java Basics - Anfänger-Themen 8
C Chars in einem String alphabetisch sortieren Java Basics - Anfänger-Themen 1
C Chars eines Strings mit for schleife rückwärts auslesen Java Basics - Anfänger-Themen 8
P Wie reagiere ich auf Strings mit zu vielen Chars ? Java Basics - Anfänger-Themen 6
J Alle Vorkommen eines chars in einem Array durch einen anderen char ersetzen Java Basics - Anfänger-Themen 10
B chars auf Zahlen überprüfen Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
Developer_X Die Kunst der Alten Runen in Chars, leider nicht in String konvertierbar? Java Basics - Anfänger-Themen 28
G wie chars mit einer menge von chars vergleichen Java Basics - Anfänger-Themen 9
X txt. mit Strings und Chars einlesen? Java Basics - Anfänger-Themen 3
H Zahlnwert eines chars Java Basics - Anfänger-Themen 5
J int-kette in chars umwandeln Java Basics - Anfänger-Themen 10
Bierhumpen chars vergleichen Java Basics - Anfänger-Themen 8
C Frage zu: String einlesen -> Array von Chars erhalten Java Basics - Anfänger-Themen 4
R Eingabe eines Chars mit Überprüfung Java Basics - Anfänger-Themen 3
J Ist es möglich einen int Array wirklich leer zu initialisieren oder zu füllen? Java Basics - Anfänger-Themen 21
M Methoden Fehler und finde die Lösung nicht wirklich Java Basics - Anfänger-Themen 6
B Schlüsselworte this - immer oder nur wenn wirklich notwendig? Java Basics - Anfänger-Themen 9
T TCP, Empfang nur wenn wirklich etwas kommt Java Basics - Anfänger-Themen 6
L Hashtable nicht wirklich geeignet für mein Vorhaben? Java Basics - Anfänger-Themen 3
D ist das wirklich ein fehler? Java Basics - Anfänger-Themen 6
-horn- Runden auf x-Stellen wirklich nur so umständlich? Java Basics - Anfänger-Themen 9
F Was ist Graphics g wirklich? Java Basics - Anfänger-Themen 5
M wait() sleep() geht nicht wirklich Java Basics - Anfänger-Themen 3
G Interfaces - Müssen wirklich alle Methoden implement. werden Java Basics - Anfänger-Themen 8
T Java wirklich gut zum programmieren lernen? Java Basics - Anfänger-Themen 43
L Zum neuzeichnen wirklich zwingen Java Basics - Anfänger-Themen 4
ven000m Java - wirklich open Source? Java Basics - Anfänger-Themen 2
A Java wirklich das richtige? Java Basics - Anfänger-Themen 20
M Einen Vector wirklich kopieren WIE GEHT DAS ??? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben