Auf Keyinputs reagieren
lima-city → Forum → Programmiersprachen → Java
code
dimension
dritten knopf
funktion
identifizieren
image
import
kenntnis
knopf
knopfdruck
machen
null
objekt
pro
realisieren
registriert danke
run
start
taste
tun
-
Heyhoo
Soviel vorweg: Ich bin kein Javapro! Ich bin ein Blutiger Anfänger in Java, hab aber PHP und C++ Kenntnisse.
Unzwar möchte ich mich mit einfachen 2D Animationen in Java beschäftigen, und habe dafür Canvas gewählt. Soweit so gut, ich habe nun also eine Klasse von Canvas abgeleitet, die über eine BufferStrategy ein BufferedImage immer wieder malt, das ganze in einem Seperaten Thread. Das ganze ist im Moment über 2 Datein geregelt, welche ich am Ende nochmal posten werde.
Ich möchte dem ganzen jetzt 2 "Features"/Funktionen hinzufügen, unzwar:
- Auf knopfdruck bleibt alles stehen / anderen Knopf startet alles wieder
- dritten knopf gedrückt halten -> stopt das ganze
Nur finde ich leider keine Hilfreichen Tuts oder so, die mir helfen die Tastenanschläge zu identifizieren, bzw die Tastatur abzufragen, ob da was gedrückt wurde.
Darum frage ich hier mal die Pros: Wie könnte ich das realisieren? Wie macht man sowas?
Liebe Grüße
Hier der Code:
package canvastestapp; import java.awt.Dimension; import javax.swing.JFrame; public class CanvasTestApp { public static void main(String[] args) { JFrame F = new JFrame("TESTFRAME"); F.setPreferredSize(new Dimension(300,300)); F.setMinimumSize(new Dimension(300,300)); F.setMaximumSize(new Dimension(300,300)); F.setResizable(false); F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); F.setVisible(true); MyCanvas MC = new MyCanvas(); MC.start(); F.add(MC); } }
package canvastestapp; import java.awt.Canvas; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferStrategy; import java.awt.image.BufferedImage; public class MyCanvas extends Canvas implements Runnable { private BufferedImage image = new BufferedImage(300,300,BufferedImage.TYPE_INT_RGB); private boolean running = false; private int line = 0; private Color color = Color.WHITE; @Override public void run() { running = true; while(running) { this.render(); //System.out.println("render"+this.line); } } public void render() { BufferStrategy bs = getBufferStrategy(); if (bs == null) { createBufferStrategy(3); return; } Graphics g = image.getGraphics(); g.setColor(this.color); g.drawRect(0, 0, line, line); if (line == 300) { if (this.color == Color.BLACK) { this.color = Color.WHITE; } else { this.color = Color.BLACK; } this.line = 0; } this.line++; g.dispose(); try { Thread.sleep(10); } catch(Exception e) { e.printStackTrace(); } g = bs.getDrawGraphics(); g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null); g.dispose(); bs.show(); } public void start() { new Thread(this).start(); } public void stop() { this.running = false; } }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Du baust dir einen KeyListener.
Den KeyListener kannst du bei jedem Component registrieren, er empfängt dann nur von diesem Component die Tastenevents.
Dadurch das die Klasse von KeyAdapter abgeleitet ist müssen nicht alle Funktionen des KeyListeners implementiert werden (in dem Fall ist das keyTyped).import java.awt.event.*; class KeyboardHandler extends KeyAdapter { boolean[] keysDown = new boolean[256]; public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); keysDown[code] = true; // was tun wenn die Taste gedrückt worden ist } public void keyReleased(KeyEvent e) { int code = e.getKeyCode(); keysDown[code] = false; // was tun wenn die Taste wieder losgelassen worden ist } public boolean isKeyPressed(int code) { return keysDown[code]; } }
Diesen KeyboardHandler kannst du jetzt so benutzen (innerhalb von deinem MyCanvas-Konstruktor):
Danach werden bei Tastenevents die Funktionen im KeyboardHandler aufgerufen.KeyboardHandler kb = new KeyboardHandler(); addKeyListener(kb);
Für den dritten Knopf gillt folgendes: Da alles in Java Event-basiert ist hast du keine Möglichkeit zu prüfen ob gerade jetzt eine Taste gedrückt worden ist. Deshalb hab ich die Funktion isKeyPressed geschrieben mit der du das prüfen kannst. Dies setzt aber voraus dass das Objekt KeyboardHandler globas ist (und nicht nur im Konstruktor vorkommt). -
Das ist ja garnicht so schwer, wie es in vielen Tutorials erklärt wird.
KeyAdapter hat den Vorteil, dass ich nicht alles einbauen muss, das ist gut zu wissen! Und mit einem addKeyListener() kann ich dann dem Objekt (in meinem Falle dem Frame) die KeyboardHandler zuweise, und dann wird es schön registriert :)
Danke, nun kann ich das tatsächlich super verwerten.
Echt großen Dank!
Liebe Grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage