Java 2D Oberfläche (Matrix)

Grekain1

Grünschnabel
Hallo,

ich habe folgende Frage: Wie erstelle ich eine 2D Oberfläche in Java (mit JFrame)?
Ich weiß, die Frage ist wohl sehr allgemein ausgedrückt, dafür will ich mich entschuldigen. Also nur um jetzt die lieben Antwortenden auf den richtigen Weg zu bringen, möchte ich hier noch einiges darlegen. Ich weiß, dass es "irgendetwas" mit "Graphics g", super, repaint(); und so weiter zu tun hat. Ich habe schon vieles in der Art gesehen, konnte es aber bei mir nie einbauen, da es meistens unvollständig war. Deswegen möchte ich nun darum bitten, es mir von Anfang an zu erklären, da ich ein richtiges Tutorial für so etwas noch nie gefunden habe.
Mit Java an sich (auf Konsolenebene) kann ich schon gut umgehen, also ihr müsst mir nicht Java von Anfang an erklären :D

Danke schonmal!
Mfg,
Grekain1

EDIT: Ich will noch ein kleines Beispiel geben, mit dem man arbeiten kann: Ich habe eine 5x5 Matrix und will diese in einem Frame mit Quadraten aufbauen. Der Inhalt einer Zelle sorgt zum Beispiel für die Farbe.
 
Zuletzt bearbeitet:
Wow danke! Ich werde mal versuchen das auf eine Matrix zu übertragen. Melde mich morgen wieder :)

Lg,
Grekain1
 
Ok ich habe das jetzt übertragen und es funktioniert gut. Jetzt will ich einen Schritt weiter gehen und einen KeyListener einbauen. Dazu habe ich mir das auf:
http://www.roseindia.net/java/example/java/awt/how-to-use-keylistener.shtml
angesehen und versucht zu übertragen. Allerdings funktioniert es weder wenn ich eine separate KeyListener Klasse habe, noch wenn ich versuche es in meine schon vorhandene paintComponent Klasse einzubinden. Am Ende sehen meine Codes so aus:

Der für die "Leinwand":
Code:
package package02;

import javax.swing.JFrame;

public class Leinwand {
	public static void main (String [] args) {
		JFrame f = new JFrame("Titel");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Grafik g = new Grafik();
		f.add(g);
		f.setSize(400,300);
		f.setVisible(true);
	}
}

Und der mit der paintComponent:
Code:
package package02;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Grafik extends JPanel implements KeyListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	public static Label l1;
	public static Panel p1;
	
	public void paintComponent (Graphics g) {
		super.paintComponent(g);
		p1 = new Panel();
		this.setBackground(Color.WHITE);
		p1 = new Panel();
		p1.setBounds(220, 20, 100, 50);
		l1 = new Label("KeyListener!");
		p1.add(l1);
		add(p1);
		addKeyListener (this) ; 
		
		for (int i=0; i<10; i++)
		{
			for (int j=0; j<10; j++)
			{
				if (Matrix.m[j][i] == 'x')
				{
					g.setColor(Color.BLUE);
				}else if (Matrix.m[j][i] == 'o')
				{
					g.setColor(Color.GREEN);
				}else if (Matrix.m[j][i] == 'S')
				{
					g.setColor(Color.BLACK);
				}
				
				g.fillRect(i*20, j*20, 20, 20);
			}
		}
	}

	public void keyTyped ( KeyEvent e ){  
    	l1.setText("Key Typed");
    }  
    
	public void keyPressed ( KeyEvent e){  
		l1.setText ( "Key Pressed" ) ; 
	}  
	
	public void keyReleased ( KeyEvent e ){  
		l1.setText( "Key Released" ) ; 
	}  
	
}

EDIT:
Und die Matrix natürlich:
Code:
package package02;

public class Matrix {
	public static char [][] m = {
		//						y ->  0    1    2    3    4    5    6    7    8    9       x
									{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, // 0
									{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, // 1
									{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, // 2
									{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, // 3
									{'S', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, // 4
									{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, // 5
									{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, // 6
									{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, // 7
									{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}, // 8
									{'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'}  // 9
	};
}
/EDIT

Und ich sehe meine Matrix so wie sie sein soll, allerdings ist das gewünschte Panel p1 mit dem Label l1 nicht richtig dargestellt und funktionell. Es hängt in der Mitte des Frames, hat Clipping Fehler und die KeyEvents klappen schon gar nicht.

Bitte um Hilfe :)

LG
Grekain1
 
Zuletzt bearbeitet:
Hallo,

habe mir deinen Code momentan noch nicht angesehen, habe nur gesehen, dass du ein Problem mit dem KeyListener hast.
Zuerst nimm ihn aus der paintComponent-Methode. Diese wird jedes mal aufgerufen, wenn die Komponente neu gezeichnet wird. Pack das add lieber in den Konstruktor.

Ein KeyListener reagiert nur, wenn die Komponente den Fokus hat. Den bekommt das JPanel allerdings nicht.
Du müsstest dem Panel noch einen MouseListener hinzufügen und in der mousePressed am besten grabFocus() aufrufen.

Java:
public void mousePressed(MouseEvent e){
    JPanel panel = (JPanel) e.getSource();
    panel.grabFocus();
}

Gruß

Sascha
 

Neue Beiträge

Zurück