Kleine Konsole mit Threads + KeyAdapter

Status
Nicht offen für weitere Antworten.

marcin

Mitglied
Hallo,

ich will ein kleines ArcadeGame schreiben, aber KEIN Applet, sondern eine Application.
Also dachte ich mir ich brauche eine Konsole, die die Bilder alle x Sekunden updatet und auf Tastatureingaben mittels eines KeyAdapters hört. Die ganze Klasse ist von JRame abegleitet und implementiert Runnable um sich als Thread zu tarnen. Hier mein kürzestes kompilierbares Beispiel:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;

public class TestBoard extends JFrame implements Runnable {

	Thread myThread;
	int rate = 40; //refresh after 40 ms
	boolean pause;
	
	private class MyKeyAdapter extends KeyAdapter{

		@Override
		public void keyPressed(KeyEvent arg0) {
			super.keyPressed(arg0);
			System.out.println("Key Pressed.");
		}
		
	}
	
	public TestBoard(){
		this.myThread = new Thread(this);
		this.pause = false;
		this.setSize(50,50);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.start();
		this.addKeyListener(new MyKeyAdapter());
	}
	
	
	@Override
	public void paint(Graphics g) {
		g.setColor(new Color((float)Math.random(), (float)Math.random(), (float)Math.random()));
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
		
	}

	public void start(){
		if(this.myThread == null){
			this.myThread = new Thread(this);
			this.myThread.start();
		}
	}
	
	public void run() {
//		while(myThread.isAlive()){
		while(true){
			long time = System.currentTimeMillis();
			this.paint(this.getGraphics());
			try{
				int sleep = (int) Math.max(0l, time + rate - System.currentTimeMillis());
				if(sleep > 0)
					Thread.sleep(sleep);
				System.out.println(sleep);
			}catch(InterruptedException iex){
				iex.printStackTrace();
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TestBoard board = new TestBoard();
	}

}
In der Paint Methode wird einfach der Hintergrund auf eine zufällige Farbe gesetzt, in der run() Methode wird paint gerufen und dann solange gewartet bis 40ms verstrichen sind. In der Theorie sehe ich keinen Fehler, aber es funktioniert nicht.
Das merkwürdige ist, ich habe irreprodizierbare Fehler mit einer ähnlich Konstruktion in dem PacmanGame was ich gerade schreibe. Mal funktioniert die Tastatureingabe nicht, mal die Grafik nicht, mal aber auch beides.
Ich hänge jetzt schon seit drei Tagen daran und mittlerweile habe ich auch keine Idee mehr, die Tutorials durch Google geben nicht so viel her.
Ich bin offen für jegliche Vorschläge, auch für einen generellen Klassendesign-Wechsel, ich schreibe so eine Konsole das erste Mal mit JAVA.
 
S

Spacerat

Gast
1. Bei Swing verwendet man AFAIK "paintComponent()" statt "paint()".
2. Innerhalb einer "run()"-Methode wäre die Verwendung von einer der "repaint()"-Methoden angebrachter.
 

marcin

Mitglied
1. Bei Swing verwendet man AFAIK "paintComponent()" statt "paint()".
2. Innerhalb einer "run()"-Methode wäre die Verwendung von einer der "repaint()"-Methoden angebrachter.

Habe beides ausprobiert, also repaint in der run() gerufen und auch paint durch paintComponents(Graphics g) ersetzt, aber dann hat die Grafik gar nichts mehr gemacht, vorher wurde wenigstens der Hintergrund farbig gemalt.:bahnhof:
 
S

SlaterB

Gast
> this.paint(this.getGraphics());

ganz übel, viel kürzer und die einzige erlaubte Variante:
this.repaint();

---------

zu Beginn von paintComponent(Graphic g) gehört
super.paintComponent(g);

--------

Konstruktor:
> this.myThread = new Thread(this);
..
> this.start();

startMethode:
> if(this.myThread == null){
> this.myThread = new Thread(this);
> this.myThread.start();
> }

kann es sein, dass das if nicht durchlaufen, ergo der Thread nicht gestartet wird?
 

marcin

Mitglied
> this.paint(this.getGraphics());

ganz übel, viel kürzer und die einzige erlaubte Variante:
this.repaint();

---------

zu Beginn von paintComponent(Graphic g) gehört
super.paintComponent(g);

--------

Konstruktor:
> this.myThread = new Thread(this);
..
> this.start();

startMethode:
> if(this.myThread == null){
> this.myThread = new Thread(this);
> this.myThread.start();
> }

kann es sein, dass das if nicht durchlaufen, ergo der Thread nicht gestartet wird?

Das mit dem repaint() habe ich jetzt gemacht und werde mir den Rat merken, auch wenn ich nicht genau weiß wieo das so schlimm ist. Aber es wird Gründe geben.
Mit der if.Abfrage hattest du absolur Recht, danach lief es so wie ich erwartet habe.
Jetz kann ich das auch auf pause schalten.
Aber das mit paintComponents() hat nicht funktioniert. Ich habe mal beide Methode überschrieben, aber es wird scheinbar nur die paint Methode gerufen:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;

public class TestBoard extends JFrame implements Runnable {

	Thread myThread;
	int rate = 40; //refresh after 40 ms
	boolean pause;
	
	private class MyKeyAdapter extends KeyAdapter{

		@Override
		public void keyPressed(KeyEvent arg0) {
			super.keyPressed(arg0);
			System.out.println("Key Pressed.");
			pause = !pause;
		}
		
	}
	
	public TestBoard(){
		this.pause = false;
		this.setSize(50,50);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.start();
		this.addKeyListener(new MyKeyAdapter());
	}
	
	@Override
	public void paint(Graphics g){
		if(!pause){
			g.setColor(new Color((float)Math.random(), (float)Math.random(), (float)Math.random()));
			g.fillRect(0, 0, this.getWidth(), this.getHeight());
		}
	}
	/* (non-Javadoc)
	 * @see java.awt.Container#paintComponents(java.awt.Graphics)
	 */
	@Override
	public void paintComponents(Graphics g) {
		super.paintComponents(g);
		g.setColor(new Color((float)Math.random(), (float)Math.random(), (float)Math.random()));
		g.fillRect(0, 0, this.getWidth(), this.getHeight());
	}


	public void start(){
		if(this.myThread == null){
			this.myThread = new Thread(this);
			this.myThread.start();
		}
	}
	
	public void run() {
		while(myThread.isAlive()){
//		while(true){
			long time = System.currentTimeMillis();
			this.repaint();
			try{
				int sleep = (int) Math.max(0l, time + rate - System.currentTimeMillis());
				if(sleep > 0)
					Thread.sleep(sleep);
				System.out.println(sleep);
			}catch(InterruptedException iex){
				iex.printStackTrace();
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TestBoard board = new TestBoard();
	}

}

Dake schon mal für die Hilfe, mein Pacman Game scheint jetzt auch besser zu laufen, aber ich wie gesagt ich hatte so das Gefühl, dass wenn Thread.sleep() mit sehr kleinen Werten gerufen wird bzw. gar nicht, weil das Zeichnen lange gedauert hat, dann scheint er nicht mehr auf Tastatureingaben zu reagieren. Deswegen weiß ich nicht ob das grundlegende Design wirklich angebracht ist für ein ArcadeGame.
 
S

SlaterB

Gast
ok, bei einem JFrame selber mag nur paint gehen, das ist eh ein Sonder-Container drumherum,
wenn du innen ein JPanel addest, dann dort paintComponent,
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Konsole - Kleine Frage Java Basics - Anfänger-Themen 22
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
P eine kleine Aufgabe mit Audio Java Basics - Anfänger-Themen 1
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
B Scanner-If/else kleine Abhebungs-Simulation Java Basics - Anfänger-Themen 3
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
L Kleine Hilfe beim Schreiben eines Programmes benötigt :D Java Basics - Anfänger-Themen 40
M Welches Framework für kleine WebApp nutzen? Java Basics - Anfänger-Themen 6
D Kleine Probleme mit Split-Befehlen Java Basics - Anfänger-Themen 5
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
CptK Interface Kleine Kreise in großem Kreis anordnen Java Basics - Anfänger-Themen 3
CT9288 Kleine Simulation programmieren, denkanstöße erbeten Java Basics - Anfänger-Themen 19
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
T Klassen Kleine Übung zum Thema Klassen Java Basics - Anfänger-Themen 3
O Kleine Frage zu Iterator und Iterable Java Basics - Anfänger-Themen 6
O Kleine Frage zu cast Java Basics - Anfänger-Themen 3
U DOM Parser, kleine Frage Java Basics - Anfänger-Themen 29
N BierSpiel von "Kopf bis Fuss" eigener Code...kleine Problemstellung. Java Basics - Anfänger-Themen 11
Anfänger2011 2 kleine Fragen zu ArrayListen Java Basics - Anfänger-Themen 5
TheSorm Kleine Speicher Klasse Java Basics - Anfänger-Themen 24
F Speicherlast mehrere GB durch kleine png files? Java Basics - Anfänger-Themen 1
T Kleine Anfängerfrage :) Java Basics - Anfänger-Themen 4
T Kleine Klausurfragen Java Basics - Anfänger-Themen 17
T viele "kleine" Fragen... Java Basics - Anfänger-Themen 3
Q Vererbung Kleine Hilfe bei einer aufgabe Java Basics - Anfänger-Themen 5
DStrohma Best Practice Hibernate für kleine Anwendung nutzen? Java Basics - Anfänger-Themen 4
N kleine get-Methode anhand einer Aufgabenstellung Java Basics - Anfänger-Themen 13
D Kleine Rechenregel... ++a Java Basics - Anfänger-Themen 4
ScottGambler Kleine Frage Java Basics - Anfänger-Themen 13
M Erste Schritte 2 Kleine Programme Java Basics - Anfänger-Themen 27
T Kleine Frage Java Basics - Anfänger-Themen 2
B Kleine Erklärung zu einer Codezeile benötigt Java Basics - Anfänger-Themen 5
A Java Flächeninhaltsberechnung kleine Frage Java Basics - Anfänger-Themen 8
H Datei in kleine Stücke teilen und wieder erkennen Java Basics - Anfänger-Themen 10
P eigene kleine Datenverwaltung Java Basics - Anfänger-Themen 5
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
S Erste Schritte Zwei kleine Fragen zu [], int und Konstruktor Java Basics - Anfänger-Themen 3
S Erste Schritte Kleine Problem mit Ausgabe in eine Datei Java Basics - Anfänger-Themen 11
G Kleine Java Programme aus Main Java Programm starten..... Java Basics - Anfänger-Themen 3
R Sehr kleine doubles nicht in Exponentialdarstellung ausgeben Java Basics - Anfänger-Themen 3
H Datenbank suche in kleine Schritte Java Basics - Anfänger-Themen 6
O kleine SwingFrame Java Basics - Anfänger-Themen 3
T Kleine Frage zu Collections Java Basics - Anfänger-Themen 3
J BlueJ! 2 kleine Fragen zum Spiel. Java Basics - Anfänger-Themen 3
J Kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
H Warum funktioniert diese kleine Methode nicht? Java Basics - Anfänger-Themen 8
E Kleine Hilfe für einen Einsteiger Java Basics - Anfänger-Themen 18
Luk10 Dateipfad beim Laden einer Datei + Neue kleine Frage! Java Basics - Anfänger-Themen 11
U actionListener - eine Kleine Frage Java Basics - Anfänger-Themen 7
M kleine Verständisfrage zur Klassenhierarchie, speziel JMenuItem Java Basics - Anfänger-Themen 8
J Kleine Frage zu Methoden & OOP Java Basics - Anfänger-Themen 4
B Paar kleine Grundsatzfragen zu Java Java Basics - Anfänger-Themen 5
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
S 2 kleine Methoden negieren und print Java Basics - Anfänger-Themen 8
J if und kleine double Werte Java Basics - Anfänger-Themen 7
H kleine zwischenfrage string Java Basics - Anfänger-Themen 3
ModellbahnerTT Kleine Frage zu doppelten Arrays Java Basics - Anfänger-Themen 3
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3
hdi Kleine Design/Convention Frage zu Konstruktoren Java Basics - Anfänger-Themen 4
hdi kleine Verständnisfrage lokale + Member Variable Java Basics - Anfänger-Themen 10
R Kleine Frage zu Array Java Basics - Anfänger-Themen 2
B kleine Probleme beim auslesen einer m3u Datei Java Basics - Anfänger-Themen 3
G eine kleine verwaltung Java Basics - Anfänger-Themen 2
M Eine kleine Frage bzw kleine Theorie frage String[arg] Java Basics - Anfänger-Themen 6
Povlsen84 Initlialisierung, Vector, serialVersionUID . kleine Fragen Java Basics - Anfänger-Themen 4
M Kleine Anfängerfrage Java Basics - Anfänger-Themen 10
D kleine Passwortabfrage erstellen incl. Method zum verändern Java Basics - Anfänger-Themen 7
G jFTP - kleine Fragen Java Basics - Anfänger-Themen 2
P Eine kleine Frage. Java Basics - Anfänger-Themen 4
M kleine sql abfrage Frage Java Basics - Anfänger-Themen 5
K Kleine Fragen über Arrays Java Basics - Anfänger-Themen 8
Z kleine frage zu: Runtime.getRuntime().exec("cmd /c) Java Basics - Anfänger-Themen 3
M Zufallszahl - kleine Frage Java Basics - Anfänger-Themen 4
K Hallo, Ich suche kleine Java Program-Aufgaben zum üben ? Java Basics - Anfänger-Themen 4
S kleine suche Java Basics - Anfänger-Themen 9
D kleine spielerei mit swing Java Basics - Anfänger-Themen 5
A Kleine Tabelle . Java Basics - Anfänger-Themen 8
U kleine datenbank Java Basics - Anfänger-Themen 86
G kleine Frage Java Basics - Anfänger-Themen 4
Q Wie kann man eine kleine pause im Programm machen? Java Basics - Anfänger-Themen 13
J Kleine Connection Frage Java Basics - Anfänger-Themen 4
J kleine java aufgabe: ausgabe von sternchen Java Basics - Anfänger-Themen 20
P kleine db-aufgabe läuft nur suboptimal Java Basics - Anfänger-Themen 8
S ein paar kleine Fragen Java Basics - Anfänger-Themen 4
M Kleine Frage zu If-Bedingung Java Basics - Anfänger-Themen 4
X Kleine Frage: Split Java Basics - Anfänger-Themen 13
G sehr kleine Dezimalzahlen (BigDecimal) falsch angezeigt Java Basics - Anfänger-Themen 5
G Eigene kleine Sprache entwickeln Java Basics - Anfänger-Themen 6
T Kleine Verständnissfrage Java Basics - Anfänger-Themen 7
J Große *.Text Datei zum verschicken in viele kleine Java Basics - Anfänger-Themen 7
A Noch ne kleine Beanshell Frage Java Basics - Anfänger-Themen 7
B eine kleine leichte aufgabe mit einem stack programmieren Java Basics - Anfänger-Themen 2
A Kleine Anfängerfragen u.a.: Kann man Random "speichern& Java Basics - Anfänger-Themen 6
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
Zrebna Kann Java Programm nicht in Konsole ausführen Java Basics - Anfänger-Themen 1
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
M Nicht genug Eingabemöglichkeiten in der Konsole Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben