Canvas: String wird nicht gezeichnet

PapaNoah

Mitglied
Hallo miteinander,
Ich arbeite gerade an einem "Schiffe versenken" für die Abschlussarbeit in der Berufsschule. Ich hänge gerade an einem ziemlich nervigen Problem fest, und zwar zeichne ich zwei praktisch identische Spielfelder in ein JFrame (Canvas => Paint() überschrieben). Sie unterscheiden sich jediglich von der Position im JFrame sowie dem Spielernamen, welcher auf der rechten Seite des Spielfelds angezeigt werden sollte. Leider funktioniert das aber irgendwie nicht, das heisst nur so halb. Wenn ich nur 1 Spielfeld zeichne klappts, zeichne ich zwei Spielfelder wird nur bei einem der Name angezeigt. Ich hoffe ihr könnt mir helfen, ich stehe leider etwas unter Zeitdruck, da ich für heute frei genommen habe um daran arbeiten zu können :(

Hier der betreffende Code:

Wenn eine Instanz von der Klasse "Player" erstellt wird, wird automatisch eine Instanz der Klasse "Playground"(in der die Paint()-Methode überschrieben wird) erstellt mit den mitgegebenen Parametern x, y, und dem Spielernamen:exclaim:
Java:
import javax.swing.*;

public class Gameplay
{
	private int coordinateX;
	private int coordinateY;
	private String rawCoordinates;
	private Player currentPlayer;
	private Playground currentPlayground;
	
	public Gameplay()
	{	
		initializeGame();
		
		
	
		Player testPlayer = new Player(20, 20, "Tester1");
		Player testPlayer2 = new Player(20, 313, "Tester2");
		showGui(testPlayer, testPlayer2);
		testPlayer.getPlayground().repaint();
		testPlayer2.getPlayground().repaint();
		
		while(true)
		{
			rawCoordinates = Actions.getCoordinates();
			coordinateX = Actions.getCoordinateX(rawCoordinates);
			coordinateY = Actions.getCoordinateY(rawCoordinates);
			Actions.attack(testPlayer.getPlayground(), coordinateX, coordinateY);
			testPlayer.getPlayground().positioningModeActivated(false);	
			testPlayer.getPlayground().repaint();
		}
	}
	
	public void showGui(Player playerA, Player playerB)
	{
		//JFrame wird erstellt
		JFrame mainFrame = new JFrame("Java - Schiffe versenken");
		
		//Spielfelder(Canvas) werden dem Frame zugewiesen
		mainFrame.add(playerA.getPlayground());
		mainFrame.add(playerB.getPlayground());
			 
		//Fenstereigenschaften werden angepasst
		mainFrame.setSize(348,615);
		mainFrame.setResizable(false);
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setVisible(true);	
	}
	
	public void initializeGame()
	{
		coordinateX = 0;
		coordinateY = 0;
		rawCoordinates = "";
	}
	
	public void showMenu()
	{
		System.out.println("=============================");
		System.out.println("======SCHIFFE=VERSENKEN======");
		System.out.println("=============================");
		System.out.println("MENU:");
		System.out.println("1 EINZELSPIELER(GEGEN COMPUTER)");
		System.out.println("2 2-SPIELER");
		System.out.println("3 SPIEL BEENDEN");
	}
}

Der Name wird in dieser Klasse bei Zeile 44 gezeichnet :exclaim:
Java:
import java.awt.*;

public class Playground extends Canvas
{
	
	private static int PLAYGROUND_SIZE = 12;
	private static int FIELD_SIZE = 20;
	private static int GAP = 2;
	
	private Field playground[][] = new Field[PLAYGROUND_SIZE][PLAYGROUND_SIZE];
	private Boolean positioningMode;
	private int fieldPositionX;
	private int fieldPositionY;
	private String playerName;
	
	public Playground(int positionX, int positionY, String playerName)
	{
		int canvasSize = (PLAYGROUND_SIZE * FIELD_SIZE) + ((PLAYGROUND_SIZE - 1)*GAP) + 21;
		setSize(canvasSize, canvasSize);
		initializePlayground();
		positioningMode = true;
		fieldPositionX = positionX;
		fieldPositionY = positionY;
		this.playerName = playerName;
	}
	
	public void paint(Graphics g)
	{
		super.paint(g);
		int x = fieldPositionX;
		int y = fieldPositionY;
		int fontPositionX = fieldPositionX;
		char yCoordinateSign = 'A';
			
		g.setFont(new Font("Consolas", Font.PLAIN, 10));
		for(int i = 0 ; i < PLAYGROUND_SIZE ; i++)
		{
			g.drawString(String.valueOf(yCoordinateSign), fontPositionX + 7, fieldPositionY - 5);
			g.setColor(Color.BLACK);
			fontPositionX += 22;
			yCoordinateSign++;
		}
		
		g.drawString(playerName, 294, y);
		System.out.println(playerName + " drawed at" + 294 + "/" + y);
		
		for(int i = 0 ; i < PLAYGROUND_SIZE ; i++)
		{
			g.setColor(Color.BLACK);
			g.drawString(String.valueOf(i + 1), (x - 15), (y + 13));
			for(int j = 0 ; j < PLAYGROUND_SIZE ; j++)
			{
				if(positioningMode)
				{
					if(playground[i][j].containsBoat())
					{
						g.setColor(Color.GREEN);
					}
					else
					{
						g.setColor(Color.GRAY);
					}
				}
				else
				{
					if(playground[i][j].isHit())
					{
						if(playground[i][j].containsBoat())
						{
							g.setColor(Color.RED);
						}
						else
						{
							g.setColor(Color.BLUE);
						}
					}
					else
					{
						g.setColor(Color.GRAY);
					}
				}
				g.fillRect(x, y, FIELD_SIZE, FIELD_SIZE);
				x += FIELD_SIZE + GAP;
			}
			x = fieldPositionX;
			y += FIELD_SIZE + GAP;
		}
	}
	
	public void paintNew()
	{
		repaint();
	}
	
	private void initializePlayground()
	{
		for(int i = 0 ; i < 12 ; i++)
		{
			for(int j = 0 ; j < 12 ; j++)
			{
				playground[i][j] = new Field();
			}
		}
	}
	
	public Field getField(int x, int y)
	{
		return playground[y][x];
	}
	
	public void setField(Boat boat, int x, int y)
	{
		playground[y][x].setBoat(boat);
	}
	
	public void positioningModeActivated(Boolean activated)
	{
		positioningMode = activated;
	}
	
	public static int getPlaygroundSize()
	{
		return PLAYGROUND_SIZE;
	}
}

spielfeld.png


Auf die Formatierung sowie auf Kommentare wurde bisher noch nicht geachtet, ich möchte zuerst dieses Problem lösen :bahnhof:

Danke im Voraus für die Hilfe!
PapaNoah
 
Zuletzt bearbeitet:

SuperSeppel13

Bekanntes Mitglied
Also so ganz genau kenn ich dein Problem jetzt nicht, aber grundsätzlich würde ich dir empfehlen, konsequent mit Swing zu arbeiten, also JPanel statt Canvas zu benutzen (und dann "paintComponent" zu überschreiben).

Außerdem verstehe ich nicht ganz, wie du es überhaupt schaffst, dass beide Canvas angezeigt werden, denn wenn ich nicht's übersehen habe, legst du für dein JFrame nicht explizit einen Layoutmanager fest, weshalb satndardgemäß BorderLayout benutzt wird, welcher eigentlich die aktuelle CENTER-Komponente rauswirft, wenn eine neue CENTER-Komponente hinzugefügt wird und da du beide Canvas ohne Parameter (also im CENTER) hinzufügst, dürfte eigentlich nur eine sichtbar sein.

Noch ein Tipp:
Statt alle Felder einzeln auf ein Canvas zu pinseln, lass doch die Klasse Field auch von JPanel erben und füge dann alle "Fields" dem Spielfeld (JPanel mit GridLayout, oder so) hinzu - dann kann auch jedes Feld selbst auf MouseEvents reagieren.
 

PapaNoah

Mitglied
Also so ganz genau kenn ich dein Problem jetzt nicht, aber grundsätzlich würde ich dir empfehlen, konsequent mit Swing zu arbeiten, also JPanel statt Canvas zu benutzen (und dann "paintComponent" zu überschreiben).

Außerdem verstehe ich nicht ganz, wie du es überhaupt schaffst, dass beide Canvas angezeigt werden, denn wenn ich nicht's übersehen habe, legst du für dein JFrame nicht explizit einen Layoutmanager fest, weshalb satndardgemäß BorderLayout benutzt wird, welcher eigentlich die aktuelle CENTER-Komponente rauswirft, wenn eine neue CENTER-Komponente hinzugefügt wird und da du beide Canvas ohne Parameter (also im CENTER) hinzufügst, dürfte eigentlich nur eine sichtbar sein.

Noch ein Tipp:
Statt alle Felder einzeln auf ein Canvas zu pinseln, lass doch die Klasse Field auch von JPanel erben und füge dann alle "Fields" dem Spielfeld (JPanel mit GridLayout, oder so) hinzu - dann kann auch jedes Feld selbst auf MouseEvents reagieren.

Zuerst einmal danke für die Antwort!
Leider versteh ich ehrlich gesagt nicht wirklich etwas von GUI-Programmierung in Java, da ich sonst eher in der .net-Umgebung zu Hause bin. Mir war das mit dem Layoutmanager gar nicht bewusst, ich werde es auf jeden Fall einmal mit einem JPanel versuchen.

Wegen dem Tipp: Das ist sicherlich eine sehr gute Idee, nur in meinem Fall brauche ich die Oberfläche nur zum darstellen, Eingaben werden über die Konsole in Empfang genommmen, da es bei dieser Abschlussarbeit eigentlich nicht um die GUI-Programmierung geht(sie wird gar nicht bewertet, deshalb möchte ich keinen zu grossen Aufwand betreiben). Aber trotzdem danke!

Habe ich denn beim JPanel ebenfalls Möglichkeiten um Strings und Vierrecke zu zeichnen? Wie muss ich das denn lösen mit dem LayoutManager? :bahnhof:

mfg PapaNoah

EDIT: Also ich hab das mal eben ausprobiert über ein JPanel, funktioniert auch, jedoch habe ich immer noch dasselbe Problem: Es wird nur bei einem Spielfeld der Name auf der rechten Seite gezeichnet... Was mache ich falsch??
 
Zuletzt bearbeitet:

SuperSeppel13

Bekanntes Mitglied
Gib deinem mainFrame erstmal ein Layout...
Java:
    mainFrame.setLayout(new GridLayout(2, 1)); //gleich nachdem du mainFrame erstellst
... und schau, wie es dann aussieht.

Damit sollte auch der Aufruf von "setSize" des Canvas/JPanels überflüssig werden - falls er das nicht eh schon war - da der LayoutManager die Größenanpassung übernimmt.
 
Zuletzt bearbeitet:

PapaNoah

Mitglied
Gib deinem mainFrame erstmal ein Layout...
Java:
    mainFrame.setLayout(new GridLayout(2, 1)); //gleich nachdem du mainFrame erstellst
... und schau, wie es dann aussieht.

Damit sollte auch der Aufruf von "setSize" des Canvas/JPanels überflüssig werden - falls er das nicht eh schon war - da der LayoutManager die Größenanpassung übernimmt.

OMG es funktioniert! Wie kann ich mich nur bedanken, mir ist gerade ein riesen Stein vom Herzen gefallen :toll: Danke für die Hilfe und einen schönen Abend wünsche ich dir :)

mfg PapaNoah
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Ein Wort in einem String färben in einer Canvas AWT, Swing, JavaFX & SWT 10
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
W Canvas oder Polygone? AWT, Swing, JavaFX & SWT 3
Monokuma Canvas Form entfernen AWT, Swing, JavaFX & SWT 2
Monokuma KeyEvent in der Canvas Klasse AWT, Swing, JavaFX & SWT 0
M Internal Frames und Canvas-Element AWT, Swing, JavaFX & SWT 9
TheJavaKid Auf eine Zeichnung im Canvas reagieren AWT, Swing, JavaFX & SWT 13
M Halbkreiszeichnen(Canvas) - Diesen mit Mouseevents bestücken AWT, Swing, JavaFX & SWT 3
dereki2000 AWT Canvas zeichnet nicht AWT, Swing, JavaFX & SWT 7
D Canvas oder scene graph? AWT, Swing, JavaFX & SWT 16
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
Prafy AWT Klickbare Bereiche auf Canvas AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX Canvas einfaches Zeichenprogramm AWT, Swing, JavaFX & SWT 7
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
L JavaFX Canvas max size? AWT, Swing, JavaFX & SWT 1
J JavaFX Rendering von Canvas sehr langsam AWT, Swing, JavaFX & SWT 2
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
Regedit JavaFX Java Canvas hört ständig auf zu aktualisieren/malen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
B JavaFX KeyEvent und Canvas draw Problem AWT, Swing, JavaFX & SWT 9
K Fragen zu JavaFx Canvas AWT, Swing, JavaFX & SWT 0
C Java FX Canvas missing getGraphicContext2D AWT, Swing, JavaFX & SWT 5
windl Overlay mit Transparentem JWindow und Canvas AWT, Swing, JavaFX & SWT 2
S JavaFX Canvas - nur eine Figur auf der Zeichenfläche färben? AWT, Swing, JavaFX & SWT 1
R JComponent auf Canvas AWT, Swing, JavaFX & SWT 8
S Canvas durch transparentes JPanel sichtbar machen AWT, Swing, JavaFX & SWT 2
A JavaFX Menubar wird von Canvas überzeichnet AWT, Swing, JavaFX & SWT 8
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
Luk10 KeyBindings mit Canvas? AWT, Swing, JavaFX & SWT 3
B LookAndFeel GWT: Canvas in TabSet nicht sichtbar AWT, Swing, JavaFX & SWT 2
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
T Canvas clipping AWT, Swing, JavaFX & SWT 4
S 2 Canvas übereinander AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Canvas Problem(Größe) AWT, Swing, JavaFX & SWT 6
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
M Wofür Canvas? AWT, Swing, JavaFX & SWT 5
frankred Swing Canvas nach "Window-resize" neu Zeichnen lassen wegen Anzeigefehler AWT, Swing, JavaFX & SWT 4
S Canvas in ScrollPane wird beim scrollen immer neu gezeichnet AWT, Swing, JavaFX & SWT 3
F Nur ein Objekt auf Canvas neu zeichnen AWT, Swing, JavaFX & SWT 4
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
lumo SWT Canvas transparent AWT, Swing, JavaFX & SWT 4
2 AWT Zeichnen in Canvas AWT, Swing, JavaFX & SWT 5
B 2D-Grafik Malen/übermalen mit Canvas AWT, Swing, JavaFX & SWT 5
L Dynamisch Objekte in Canvas zeichnen AWT, Swing, JavaFX & SWT 5
G Auf Canvas zeichnen nur über boolean-Abfragen? AWT, Swing, JavaFX & SWT 5
S Canvas-Inhalt in Laufzeit ändern AWT, Swing, JavaFX & SWT 6
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
S Bild wird auf Canvas in Applet nicht gezeichnet AWT, Swing, JavaFX & SWT 4
G SWT Linie unter transparentes Canvas zeichnen AWT, Swing, JavaFX & SWT 4
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
S SWT Canvas: Flackernde Bilder AWT, Swing, JavaFX & SWT 3
T AWT canvas AWT, Swing, JavaFX & SWT 3
T SWT Canvas Koordinaten per MouseMove auslesen AWT, Swing, JavaFX & SWT 1
H Zeichnen auf smartgwt Canvas AWT, Swing, JavaFX & SWT 4
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
K Swing Sinuskurve zeichnen auf Canvas AWT, Swing, JavaFX & SWT 2
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
D Canvas soll angezeigtes jpg-Bild aktualisieren AWT, Swing, JavaFX & SWT 4
N zeichnen auf awt canvas AWT, Swing, JavaFX & SWT 9
J Canvas Inhalt als Bild speichern! AWT, Swing, JavaFX & SWT 16
T zeichnen mit canvas AWT, Swing, JavaFX & SWT 3
S repaint im Canvas AWT, Swing, JavaFX & SWT 3
D Canvas und Buttons AWT, Swing, JavaFX & SWT 20
P Zeichnen in Canvas und Neuzeichnen AWT, Swing, JavaFX & SWT 3
G Canvas + Swing-Objekte AWT, Swing, JavaFX & SWT 5
C canvas.draw zeichne ohne ausfüllen AWT, Swing, JavaFX & SWT 9
P Canvas in JFrame mit GridLayout AWT, Swing, JavaFX & SWT 4
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2
T Canvas gegen Container austauschen --> GUI fehlt AWT, Swing, JavaFX & SWT 4
P Canvas Inhalt löschen AWT, Swing, JavaFX & SWT 4
D Canvas über JMenuBar AWT, Swing, JavaFX & SWT 7
F ToolTip auf Canvas AWT, Swing, JavaFX & SWT 2
L Probleme mit mehreren Canvas: Überlagerungseffekte? AWT, Swing, JavaFX & SWT 5
N Zu hoher Speicherverbrauch beim Zeichnen (Canvas) AWT, Swing, JavaFX & SWT 5
G Canvas im JPanel - "Freie" Fläche Problem AWT, Swing, JavaFX & SWT 10
T Textfeldwert in canvas AWT, Swing, JavaFX & SWT 4
D cannot access Canvas AWT, Swing, JavaFX & SWT 13
G Canvas in SWT aktualisieren AWT, Swing, JavaFX & SWT 21
S AUF Canvas Zeichnen Fehler! AWT, Swing, JavaFX & SWT 10
G Canvas löschen AWT, Swing, JavaFX & SWT 15
H Sowas wie ein Canvas AWT, Swing, JavaFX & SWT 3
D Inhalt einer Canvas löschen (SWT.NO_BACKGROUND gesetzt) AWT, Swing, JavaFX & SWT 3
G GridBagLayout mit Canvas-Positionsproblem AWT, Swing, JavaFX & SWT 5
J Canvas und JTextField AWT, Swing, JavaFX & SWT 2
T erkennen ob innerhalb oder außerhalb von canvas gezeichnet AWT, Swing, JavaFX & SWT 2
S Problemen mit Canvas-Objekten im GridLayout AWT, Swing, JavaFX & SWT 8
P Tranparentes Canvas AWT, Swing, JavaFX & SWT 8
P Inhalt eines Canvas verkleinern AWT, Swing, JavaFX & SWT 3
G Canvas, JMenu, und BufferStrategy AWT, Swing, JavaFX & SWT 2
M Codeteilung -> Canvas zeichnet nicht mehr AWT, Swing, JavaFX & SWT 40

Ähnliche Java Themen

Neue Themen


Oben