BorderLayout

RMeier

Mitglied
Hallo Leute,

ich brauche Hilfe beim BorderLayout.

Ich möchte 4 Objekte abgeleitet von JPanel um ein ein fünftes JPanel legen.

Irgendwie werden die Außenränder nicht so groß gezeichnet,
als sie wären. Da brauche ich eure Hilfe, weil ich den Fehler nicht finde.
Dann möchte ich die Länge des Außenrandes in East und West gleich groß
erhalten (133 * 100 px). Ich bin daran kläglich gescheitert.

Das Trisento Spiel JPanel poste ich hier nicht.

Dafür den Code für die 4 Jpanels und der entsprechende Frame mit BorderLayout:

Seitenraender.java
Code:
package trisento_grid;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Seitenraender extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
//	private static final int randzeile = 8;
//	private static final int randspalten = 6;
	Feld[][] spielfeldrand;
	int randseite;

	// 1 oberer und unterer Spielfeld-Rand, 2 für linker und rechter Rand
	public Seitenraender(int spielfeldRand) {
		if (spielfeldRand == 1) {
			randseite = 1;
			erzeugeRand();
		} else if (spielfeldRand == 2) {
			randseite = 2;
		}

	}

	private void erzeugeRand() {
		if (randseite == 1) {
			spielfeldrand = new Feld[1][8];
			for (int i = 0; i < 1; i++) {
				for (int j = 0; j < 8; j++) {
					spielfeldrand[i][j] = new Feld(j * 133, 0, 133, 100);
					spielfeldrand[i][j].setFarbe(Color.LIGHT_GRAY);
				}
			}
		}
		else if(randseite == 2) {
/*			spielfeldrand = new Feld[6][1];
			for (int i = 0; i < 6; i++) {
				for (int j = 0; j < 1; j++) {
					spielfeldrand[i][j] = new Feld(0, i * 100, 133, 100);
					spielfeldrand[i][j].setFarbe(Color.LIGHT_GRAY);
				}
			}*/
		}
	}

	public void paintComponent(Graphics rand) {
		super.paintComponent(rand);
		zeichneRand(rand);
	}

	private void zeichneRand(Graphics rand) {
		if (randseite == 1) {
			//Rand oben und unten
			for (int i = 0; i < 1; i++) {
				for (int j = 0; j < 8; j++) {
					
					//Beschriftung mit Buchstaben
					if (j > 0 && j < 7) {
						//arbeitet mit zahhlen und parst diese in chars zu String
						rand.setColor(spielfeldrand[i][j].getFarbe());
						rand.fillRect(spielfeldrand[i][j].x,
								spielfeldrand[i][j].y,
								spielfeldrand[i][j].width,
								spielfeldrand[i][j].height);
						
						//Buchstabe generieren und schreiben
						char buchstabe = (char)(64 + j);
						rand.setColor(Color.black);
						rand.setFont(new Font("Calibri", Font.BOLD, 14));
						rand.drawString(String.valueOf(buchstabe), spielfeldrand[i][j].x + 66, spielfeldrand[i][j].y + 50);
					} else {
						rand.setColor(spielfeldrand[i][j].getFarbe());
						rand.fillRect(spielfeldrand[i][j].x,
								spielfeldrand[i][j].y,
								spielfeldrand[i][j].width,
								spielfeldrand[i][j].height);
					}
					
					//Gitter rübersetzen
					rand.setColor(Color.white);
					rand.drawRect(spielfeldrand[i][j].x,
							spielfeldrand[i][j].y,
							spielfeldrand[i][j].width,
							spielfeldrand[i][j].height);
				}
			}
		}
		else if (randseite == 2)
		{
			for(int i = 0; i < 6; i++) {
				rand.setColor(Color.LIGHT_GRAY);
				rand.fillRect(0, i * 100, 133, 100);
				
				rand.setColor(Color.WHITE);
				rand.drawRect(0, i * 100, 133, 100);
				
				//Text
				rand.setColor(Color.black);
				rand.setFont(new Font("Calibri", Font.BOLD, 14));
				rand.drawString(String.valueOf(i + 1), 63, (i * 100) + 50);
			}
		}
	}
	
/*	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame fenster = new JFrame("Trisentoseite");
//		fenster.setTitle("Trisento");
		fenster.setSize(871, 629);
		fenster.setLocation(100, 100);
		fenster.setResizable(false);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.getContentPane().add(new Seitenraender(2));
//		fenster.pack();
		fenster.setVisible(true);
	} */
}

TrisentoBorderLayout.java
Code:
package trisento_grid;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.JFrame;

public class TrisentoBorderLayout extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2203104514633638245L;
	final private Spielfelder trisento = new Spielfelder();
	final private Seitenraender randoben = new Seitenraender(1);
	final private Seitenraender randunten = new Seitenraender(1);
	final private Seitenraender randlinks = new Seitenraender(2);
	final private Seitenraender randrechts = new Seitenraender(2);
	//muss immer etwas mit BorderLayout heißen
	final private String[] rahmen = {BorderLayout.EAST, BorderLayout.NORTH, BorderLayout.WEST, BorderLayout.SOUTH, BorderLayout.CENTER};
	/**
	 * @param args
	 */
	public TrisentoBorderLayout() {
		Container layout = getContentPane();
		//Layout laden in Container
//		layout.setSize(new Dimension(1100, 1100));
		layout.setLayout(new BorderLayout());
//		layout.setMaximumSize(new Dimension(807, 629));
		layout.add(randoben, rahmen[1]);
		layout.add(trisento, rahmen[4]);
		layout.add(randunten, rahmen[3]);
		layout.add(randlinks, rahmen[0]);
		layout.add(randrechts, rahmen[2]);
	}
		
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame fenster = new TrisentoBorderLayout();
		fenster.setTitle("Trisento");
		fenster.setSize(834, 650);
//		fenster.setSize(807, 629);
		fenster.setLocation(0, 0);
		fenster.setResizable(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//		fenster.getContentPane().add(new Spielfelder());
//		fenster.pack();
		fenster.setVisible(true);
	}
}

Wie kann man es besser machen?

Beste Grüße
 
Damit das BorderLayout den Komponenten die richtige größe gibt, musst du die preferredSize der Komponenten durch setPreferredSize(Dimension d) setzen. setSize ist dem BorderLayout ganz egal 🙂
 
Danke, das Fenster ist groß genug jetzt, aber die JPanels werden nicht so groß, als sie könnten.

Wie kann man denn jetzt die Rahmen-Inhalt größer setzen?
 
Nur das Center wird so groß wie möglich gemacht, alle anderen Positionen bekommen nur bis zur PreferredSize (höhe für north und south, breite für east und west) platz.
 

Neue Themen


Zurück
Oben