Layout

Status
Nicht offen für weitere Antworten.

ChrisG

Mitglied
Hallo zusammen,
ich bastel gerade an einem kleinen Spiel namens Kaskade.

Aktuel teste ich gerade die Spieleoberfläche.
Bei einem rechts-Klick baut sich das Spielfeld auf, bei einem links-Klick werden in einem Feld Steine gezeichnet.
Zwei Probleme habe ich :
- wenn ich das Fenster an den Rändern anklick und die Größe verändere, ist der Inhalt plötzlich weg
- wenn ich die Bildlaufleisten nutze, dann aktualisiert sich der Inhalt nicht korreckt. Einige Felder überlappen sich plötzlich.

Noch zur Info :
Das "Spiel" beinhaltet noch KEINE Spielefunktionalität, es geht mir hier nur darum die Funktionsweise des Spielfeld- und Steinezeichnens zu verstehen.


Hier mal der Quelltext :
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class GamePanel extends JPanel {
	
	int fieldLength = 50;
	int fieldHeight = 50;
	int fieldSpace  =  5;
	int fieldCountX = 10;
	int fieldCountY = 10;		
	
	public void paintArray(){
		Graphics g = getGraphics();
		
		int posX = fieldSpace;
		int posY = fieldSpace;
		int counterI = 1;
		int counterJ = 1;	
		
		while ( counterJ <= fieldCountY ){
			while ( counterI <= fieldCountX ){
				g.setColor(Color.LIGHT_GRAY);
				g.fillRoundRect(posX, posY, fieldLength, fieldHeight, 10, 10);
				g.setColor(Color.BLACK);
				g.drawRoundRect(posX, posY, fieldLength, fieldHeight, 10, 10);			
				posX = posX + fieldLength + fieldSpace;
				counterI++;
			}
			posY = posY + fieldHeight + fieldSpace;
			posX = fieldSpace;
			counterI = 1;
			counterJ++;
		}			
	}	
	
	public void paintStone ( int inPosX, int inPosY, int inCount, Color inColor) {
		Graphics g = getGraphics();
		Dimension fieldNum;
		Dimension fieldPos;
		
		fieldNum = calcFieldNum(inPosX, inPosY);
		
		if ((fieldNum.height > 0) && (fieldNum.width > 0)){
			fieldPos = calcFieldStartPos(fieldNum);
			
			g.setColor(Color.LIGHT_GRAY);
			g.fillRoundRect(fieldPos.height, fieldPos.width, fieldLength, fieldHeight, 10, 10);
			g.setColor(Color.BLACK);
			g.drawRoundRect(fieldPos.height, fieldPos.width, fieldLength, fieldHeight, 10, 10);				
			g.setColor(inColor);
		
			switch (inCount){
				case 1:
					g.fillOval(fieldPos.height + 20, fieldPos.width + 20, 10, 10);
					break;
					
				case 2:
					g.fillOval(fieldPos.height +  5, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width + 35, 10, 10);				
					break;
					
				case 3:
					g.fillOval(fieldPos.height +  5, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 20, fieldPos.width + 20, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width + 35, 10, 10);
					break;
					
				case 4:
					g.fillOval(fieldPos.height +  5, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height +  5, fieldPos.width + 35, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width + 35, 10, 10);
					break;
					
				case 5:
					g.fillOval(fieldPos.height +  5, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 20, fieldPos.width + 20, 10, 10);
					g.fillOval(fieldPos.height +  5, fieldPos.width + 35, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width + 35, 10, 10);
					break;
					
				case 6:
					g.fillOval(fieldPos.height +  5, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 20, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height +  5, fieldPos.width + 35, 10, 10);
					g.fillOval(fieldPos.height + 20, fieldPos.width + 35, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width + 35, 10, 10);
					break;
				
				case 7:
					g.fillOval(fieldPos.height +  5, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 20, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width +  5, 10, 10);
					g.fillOval(fieldPos.height + 20, fieldPos.width + 20, 10, 10);
					g.fillOval(fieldPos.height +  5, fieldPos.width + 35, 10, 10);
					g.fillOval(fieldPos.height + 20, fieldPos.width + 35, 10, 10);
					g.fillOval(fieldPos.height + 35, fieldPos.width + 35, 10, 10);
					break;
					
				default:					
					break;
			}
		}
		
	}
		
	public Dimension calcSize(){
		Dimension dimension;
		int posX;
		int posY;
		
		posX = ( fieldLength + fieldSpace ) * fieldCountX ; 
		posY = ( fieldHeight + fieldSpace ) * fieldCountY ;
		
		dimension = new Dimension (posX,posY);
		return dimension;
	}
		
	public Dimension calcFieldNum ( int inPosX, int inPosY ){
		int counter;
		int posMin; int posMax;
		int posX; int posY;
		boolean check;
		
		// X-Position berechnen
			counter = 1;
			posMin = - fieldLength;
			posMax = 0;
			check = false;
			while ((counter <= fieldCountX)  && (check == false)){
					posMin = posMin + fieldSpace + fieldLength;
					posMax = posMax + fieldSpace + fieldLength;
				
				if ((inPosX > posMin) && (inPosX <= posMax)){
					check = true;
				}
				else {
					counter ++;
				}			
			}
			
			if (check == false){
				posX = 0;			// inPosX liegt nicht in einem Feld
			}
			else {
				posX = counter;		// inPosX liegt in einem Feld. counter ist die Feldnummer
			}		
		
		// Y-Position berechnen
			counter = 1;
			posMin = - fieldHeight;
			posMax = 0;
			check = false;
			while ((counter <= fieldCountY)  && (check == false)){
					posMin = posMin + fieldSpace + fieldHeight;
					posMax = posMax + fieldSpace + fieldHeight;
				
				if ((inPosY > posMin) && (inPosY <= posMax)){
					check = true;
				}
				else {
					counter ++;
				}			
			}
			
			if (check == false){
				posY = 0;			// inPosY liegt nicht in einem Feld
			}
			else {
				posY = counter;		// inPosY liegt in einem Feld. counter ist die Feldnummer
			}	
		
		return new Dimension ( posX, posY);
				
	}		
	
	public Dimension calcFieldStartPos ( Dimension inField ){
		int posX = fieldSpace;
		int posY = fieldSpace;
		int counter = 1;
		
		while ( counter < inField.getHeight()){
			posX = posX +  fieldLength + fieldSpace;
			counter ++;
		}
		counter = 1;
		while ( counter < inField.getWidth()){
			posY = posY + fieldHeight + fieldSpace;
			counter ++;
		}
		
		return new Dimension (posX, posY);
	}
		
}



class GameFrame extends JFrame implements ActionListener, MouseListener {
	
	GamePanel pnlGame;
	JScrollPane pnlScroll;
	
	int i = 0;

	
	public GameFrame() {
		setTitle("Kaskade");
		setSize(1024,768);
		
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});		
		
		Container contentPane = getContentPane();
		pnlGame		= 	new GamePanel();
		pnlScroll 	= 	new JScrollPane(pnlGame); 
		
		pnlGame.setPreferredSize(new Dimension (pnlGame.calcSize().width,pnlGame.calcSize().height));
		pnlScroll.setPreferredSize(new Dimension(100,100));
		
		pnlGame.addMouseListener(this);
		contentPane.add(pnlScroll,BorderLayout.CENTER);				
	}
	

    public void actionPerformed(ActionEvent e) {}
    
    public void mouseReleased(MouseEvent e){}
    public void mouseClicked(MouseEvent e){ 
    	if (SwingUtilities.isRightMouseButton(e)){
    		pnlGame.paintArray();
    	}
    	else {
	    	pnlGame.paintStone(e.getX(),e.getY(),i,Color.BLACK);
	    	i++;
	    	if (i == 8){
	    		i = 0;
	    	}
    	}
    }
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
	
    
}



public class GameWindow {
		
	public static void main(String[] args){
		
	    //Display the window.
        GameFrame frmKaskade = new GameFrame();
        frmKaskade.setSize(800, 600);
        frmKaskade.setVisible(true);
        frmKaskade.show();
		
				
	}	
	
}



Danke schon mal

Gruß
Christoph
 

Michael...

Top Contributor
Hier im AWT, Swing & SWT Forum, im obersten Thread werden die Grundlagen des Zeichnens erklärt.

Zu Deinem Code:
- man sollte es vermeiden, getGraphics() eine Komponente aufzurufen, da man nie weiss, was bzw. ob was zurückgeben wird --> deshalb auch Deine Probleme beim Scrollen bzw. das Verschwinden des Inhalts
- das Zeichnen in eine Swing-Komponente in deren überschriebene paintComponent(Graphics g) implementieren
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
S Layout - Problem AWT, Swing, JavaFX & SWT 1
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
J ComboBoxModel addElement verändert Layout AWT, Swing, JavaFX & SWT 8
E Probelm mit Layout AWT, Swing, JavaFX & SWT 1
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
P Tipps für GUI-Layout AWT, Swing, JavaFX & SWT 2
M Passender Layout-Manager AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
N Swing Zweifarbiges Layout für den Filechooser AWT, Swing, JavaFX & SWT 12
B LayoutManager Card Layout AWT, Swing, JavaFX & SWT 2
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
B SWT layout invalidieren in SWT? AWT, Swing, JavaFX & SWT 4
R Welchen Layout Manager/ Wie strukturieren? AWT, Swing, JavaFX & SWT 14
J Layout: oben 20% unten 80% AWT, Swing, JavaFX & SWT 12
T Layout für Listendarstellung AWT, Swing, JavaFX & SWT 3
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
C LayoutManager Passendes Layout gesucht AWT, Swing, JavaFX & SWT 2
M Layout funktioniert nicht AWT, Swing, JavaFX & SWT 3
dzim Layout von Panes in JFX2 AWT, Swing, JavaFX & SWT 17
H Layout Idee AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
J LayoutManager Komponentenaustausch zerschießt Layout AWT, Swing, JavaFX & SWT 4
F Layout-Problem AWT, Swing, JavaFX & SWT 2
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
D Bild in JPanel verschiebt Layout. Wie fixieren? AWT, Swing, JavaFX & SWT 9
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
ARadauer Wenig Material zum Thema: Design, Layout, Usability von Swing Anwendungen AWT, Swing, JavaFX & SWT 11
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
G LayoutManager Layout welches von Links nach rechts anordnet mit TOP Alignment! AWT, Swing, JavaFX & SWT 5
A Best practice für konkretes Layout AWT, Swing, JavaFX & SWT 10
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
A Layout/JPanelgröße AWT, Swing, JavaFX & SWT 6
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
J LayoutManager Welchen Layout/Design-Manager? AWT, Swing, JavaFX & SWT 4
R Swing Layout setzen AWT, Swing, JavaFX & SWT 3
L Layout automatische Anpassung umgehen? AWT, Swing, JavaFX & SWT 5
A Problem mit Layout-Manager AWT, Swing, JavaFX & SWT 11
J Button Layout anpassen AWT, Swing, JavaFX & SWT 22
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
B Buttongröße im Layout AWT, Swing, JavaFX & SWT 4
B LayoutManager Layout Problem AWT, Swing, JavaFX & SWT 14
O LayoutManager Layout entwerfen AWT, Swing, JavaFX & SWT 3
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
C LayoutManager Layout und vergrößern des Frames AWT, Swing, JavaFX & SWT 5
E Swing Runde Buttons / Position eines Obj. im Layout AWT, Swing, JavaFX & SWT 7
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
A Ungewollte Layout änderungen AWT, Swing, JavaFX & SWT 3
A Suche: Eclipse-GUI-Layout AWT, Swing, JavaFX & SWT 5
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11
N Swing Layout positionieren AWT, Swing, JavaFX & SWT 2
B Methode setzt nicht das Layout in einer if-Abfrage AWT, Swing, JavaFX & SWT 13
H LayoutManager Dynamisches Layout AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben