Java Draw -JFrame finde nicht die Mitte & höhe, breite

Zidinjo

Mitglied
Hallo liebe Community,

ich habe mal wieder eine Frage und zwar habe ich ein Programm geschrieben, wo ein JFrame mit Graphics gefüllt werden. Nun finde ich mit getWidth() und getHeight() angeblich den verfübaren Platz meiner Componente. Wenn ich diese eingibt erscheint schon mal kein Bild. Wenn ich dahinter -20 mache, dann sind die eben da aber es ist einfach statisch, wenn ich das JFrame vergrößere verschiebt sich natürlich wieder alles, da es statisch ist. Ich versuche mit g.drawRect ein Rahmen zu erstellen und in diesem Rahmen soll mein g.fillRect zentriert reinpassen. Kann mir jhemand helfen ?

Java:
package de.marvin.oopLabor3;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JPanel;

public class Square extends JPanel  {
	
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.setColor(Color.BLACK);
		g.fillRect(getWidth()-getWidth()/2,getHeight()-getHeight()/2,getWidth()-getWidth()/2,getHeight()-getHeight()/2); // x, y kordi - dann größse
		g.setColor(Color.BLUE);
		g.drawRect(getWidth()-getWidth()/2+1,getHeight()-getHeight()/2+1, getWidth()-getWidth()/2+1, getHeight()-getHeight()/2+1);
	}

}

ich habe dort iurgendwas versucht, damit ist automatisch wird aber irgendwie funktionert das nicht. Also wie finde ich die mitte und den äußersten Ring der Componente ?
 
An der Methode ist nichts falsch, es wird ein Rechteck von der Mitte bis zur rechten unteren Ecke gezeichnet.
Das führt zu der Annahme, dass du das Panel falsch ins Frame oder den Dialog einbettest. Ich gehe davon aus, dass die Panelgröße nicht an das Frame angepasst wird.

Hier ist ein Beispiel, wie's funktioniert:
Java:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class TestFrame  {
    public static void main(String args[]) {
        JFrame testFrame = new JFrame();
        testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        testFrame.setLayout(new BorderLayout());
        testFrame.getContentPane().add(new Square(), BorderLayout.CENTER);
        testFrame.setVisible(true);
    }
}
 
Zuletzt bearbeitet:
Ja, habe als Fenster schon das Gridlayout gewählt. 🙁 Bekomme es einfach nicht hin 😀

Java:
package de.marvin.oopLabor3;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class FeldErstellung {
	
	FeldErstellung()
	{
		JFrame f = new JFrame("Spiel");
		Random r = new Random();
		boolean felder = true;
		int counter = 0;
		f.setSize(400,400);
		f.setLocationRelativeTo(null);
		f.setLayout(new GridLayout(8,8));
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setResizable(false);
		
		while(felder)
		{
			int peter = r.nextInt(3);
			switch(peter)
			{
			case 1:
				f.add(new Square());
				break;
			case 2:
				f.add(new Square());
				break;
			case 3:
				f.add(new Square());
				break;
				
				default:
					f.add(new Square());
				break;
			}
			
			counter++;
			if(counter == 64)
			{
				felder = false;
			}
			
		}
		
		f.setVisible(true);
	}

}
 
Ich hab den Code von Square und FeldErstellung Code 1:1 kopiert ... das klappt.
Das einzige, was noch fehlt, ist die Main-Methode:
Java:
    public static void main(String[] args) {
        new FeldErstellung();
    }
In jedem der 64 Felder wird die untere rechte Hälfte ausgemalt.
 
Ja, das stimmt. 🙂 Das Problem ist, dass ich mit drawrect ein viereck zeichne und das soll die grenze sein, da ich gerne dort drine noch was zeichnen möchte.


Edit*

Ich habe es einfach so gemacht, leider mit statischen werten im drawRect.

Java:
package de.marvin.oopLabor3;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class Square extends JPanel  {
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.setColor(Color.BLACK);
		g.fillRect(getWidth()/2,getHeight()/2,getWidth()/1,getHeight()/1); // x, y kordi - dann größse
		g.setColor(Color.BLUE);
		g.drawRect(getWidth()/40,getHeight()/40,getWidth()-2,getHeight()-2);
	}

}
 
Zuletzt bearbeitet:
OH, dann hab ich das von Anfang an falsch verstanden, doh!
Hab gedacht, du würdest gar keine Größe kriegen.

Probier's mal hiermit:
Java:
public class Square extends JPanel  {
        @Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
                final Dimension dBorder = getSize();
                final Dimension dFill = new Dimension(dBorder.width / 2, dBorder.height / 2);
                final Point p0Border = new Point();
                final Point p0Fill = new Point(
                        (dBorder.width - dFill.width) / 2, 
                        (dBorder.height - dFill.height) / 2);
		g.setColor(Color.BLACK);
		g.fillRect(p0Fill.x,p0Fill.y, dFill.width, dFill.height);
		g.setColor(Color.BLUE);
		g.drawRect(p0Border.x, p0Border.y, dBorder.width, dBorder.height);
	}
}
 
Gerne. Eigentlich hab ich alles aufgespaltet, damit man es gut sieht 🙂
Der Lesbarkeit halber hab ich die Größen in den Variablen dBorder, dFill (Größen des Rahmens und des zu füllenden Rechtecks) und die Offsets in den Variablen p0Border (eigentlich überflüssig, da der sicher bei 0,0 liegt) und p0Fill gespeichert.
Als erstes wird die Größe des umgebenden Rechtecks gesetzt, 1:1 zur Größe des Panels.
Die Größe des zu füllenden Rechtecks ist jeweils die Hälfte davon (du könntest hier auch 80% oder was auch immer verwenden).
Das Offset links des zu füllenden Rechteks ist die Hälfte der Differenz der beiden Breiten.
Das Offset oben die Hälfte der Differenz der Höhen.

Du hast dich in deinem Programm entweder mit all den getWidth() entweder arg verzettelt (getWidth()-getWidth()/2+1 spricht Bände) oder aber dir war nicht bewusst, dass man bei einem Rechteck die linke obere Ecke als Ursprung angibt.
 

Zurück
Oben