Fenstermodus

Gerlon

Aktives Mitglied
Guten Tag,

ich versuche mich gerade an meinem ersten Programm mit grafischer Oberfläche.

Ich habe mir ein Frame erstellt und einen "Spieler" mit dem kann man sich bisher darin bewegen.
Damit man nicht aus dem Frame herausfahren kann haben ich Bedingungen festgelegt.
Das Problem ist das bei dem Fenstermodus aber die Auflösung ja der komplette Frame ist und ich somit eine kleinere Fläche nutze.

Java:
	if(posx>worldsize_x-bounding.width)posx = worldsize_x-bounding.width;
			if(posy>worldsize_y-bounding.height)posy = worldsize_y-bounding.height;

Habe für die rechte und untere Seite bisher diese Bedingungen genutzt. Aber damit passt es noch nicht ganz.
Nun meine Frage kann man das Frame irgendwie anpassen das der genutzte Raum sich der gewünschten Größe anpasst oder kann ich die Bedingungen anders lösen ?
Eine Sache wäre natürlich das an meine Figur anzupassen aber gibt es da nicht eine etwas allgemeinere Lösung, falls diese sich ändert ?!

mit freundlichen Grüßen

Gerlon
 

Michael...

Top Contributor
Da man ja üblicherweise nicht direkt in einem Frame/JFrame zeichnet, sondern in einem JPanel und dieses im (CENTER Bereich des) JFrame platziert, kannst man an diesem (JPanle) per setPreferredSize() die gewünschte Größe setzen und muss am JFrame nur pack() aufrufen, damit dieser sich dem JPanel in der Größe anpasst.
Als Grenzen nimmt man dann selbstverständlich die Breite und Höhe des JPanels.
 

Gerlon

Aktives Mitglied
Wie würde ich das machen habe bisher einfach nur f.setSize genommen. Gerade etwas rumprobiert aber will irgendwie noch nicht.
Andere Frage muss ich dann alles an das Panel anpassen, habe bisher ja alles im Frame gezeichnet ?!
 

Michael...

Top Contributor
Andere Frage muss ich dann alles an das Panel anpassen, habe bisher ja alles im Frame gezeichnet ?!
Was heißt "alles" anpassen? Man muss ja nur den Zeichenmechanismus statt im Frame im Panel implementieren.

Ein Frame ist nur ein "Container" um Inhalt in einem Fenster anzuzeigen, daher würde ich an einem Frame nichts ändern ausser ich will das Fenster selbst anpassen.

Java:
JFrame frame = new JFrame();
JPanel panel =  new JPanel() {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.drawString("width: " + this.getWidth() + " height: " + this.getHeight(), 10, 10);
    }
};
panel.setPreferredSize(new Dimension(200, 200));
panel.setBackground(Color.WHITE);
frame.add(panel);
frame.pack();
frame.setVisible();
 

Gerlon

Aktives Mitglied
Hm denke mal das es jetzt halbwegs erstmal funktioniert hat, habe da denke ein Panel erzeugt. Aber dieses ist irgendwie noch nicht richtig angepasst. Habe jetzt auf der rechten und unteren Seite eine Kante.
Liegt das eventuell daran ?

Java:
screen = new Screen();
			screen.setBounds(0, 0, 800, 600);
			add(screen);

oder an dem gezeichneten ?

Java:
	protected void paintComponent (Graphics g){
				super.paintComponent(g);
				
				g.drawImage(bg.getLook(), bg.getX(), 0, null); //das ist der Hintergrund, 2x da ich den reseten wollte
				g.drawImage(bg.getLook(), bg.getX()+bg.getLook().getWidth(), 0, null);
				
		
				g.drawImage(spieler.getLook(), spieler.getBounding().x, spieler.getBounding().y, null);
				
				
			}

Hoffe ist ersichtlich was ich hier vorhatte, sonst kann ich den Code der Klasse auch nochmal komplett posten.
 

Gerlon

Aktives Mitglied
Ich habe eine extra Klasse für die Grafischen Dinge und Aufrufe zum Beispiel.
Da hatte ich das dann halt so gemacht. Da sieht der Konstruktor bisher so aus.
Java:
	public class Frame extends JFrame {
		
		private Screen screen;
		final Spieler spieler;
		final Background bg;

		
		public Frame(Spieler spieler, Background bg){
			super("Frame");
			screen = new Screen();
			screen.setBounds(0, 0, 800, 600);
			add(screen);
			addKeyListener(new KeyHandler());
			this.spieler = spieler;
			this.bg = bg;
		}

In der Main habe ich das Panel erstellt. Und dieses wird nun irgendwie nicht komplett ausgefüllt da sind an der rechten und unteren Seite Kanten entstanden, keine Ahnung warum. Denke das Panel ist größer als der genutzte Bereich.

Java:
		JPanel panel = new JPanel();  
		Spieler spieler = new Spieler(300,300,50,800,600);
		Background bg = new Background(150);
		
		Frame f = new Frame(spieler, bg);
		
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		f.setSize(800,600);
		
          
        panel.setPreferredSize(new Dimension(800,600));
        f.add(panel);
        f.pack();
         
		f.setVisible(true);
		f.setResizable(false);
		f.setLocationRelativeTo(null);

Hatte das halt alles auf JFrame ausgelegt bisher, daher irgendwie Probleme denk ich. Und außerdem bisher auch noch keine sonderliche Erfahrung.
 
Zuletzt bearbeitet:

Michael...

Top Contributor
In der Klasse Frame (würde einen anderen Namen wählen, es gibt bereits java.awt.Frame) fügst Du ein Screen Objekt hinzu. Im zweiten Code erzeugst Du ein leeres JPanel und fügst das Deinem Frame zu, dadurch fliegt das Screen Objekt wird raus.
Da Du scheinbar trotzdem irgendwas siehst, scheint da noch einiges im Argen zu liegen.
 

Gerlon

Aktives Mitglied
Habe es jetzt alles nochmal anders gemacht. Panel usw wonach sich das Frame richtet. Aber irgendwie habe ich jetzt das Problem das ich beim zeichnen irgendwelche Fehler bekomme.
Zum Beispiel wenn ich den Hintergrund einfach nur Blau setze passiert nichts. Und meine Figur hat wie Schemen dh. wenn ich mich bewege wird jede Position davor mit der Grafik noch angezeigt.
Liegt das an der Methode wo gezeichnet wird oder kann das andere Ursachen haben?

Vielleicht hat ja jemand eine Idee woran sowas liegen könnte. Habe eigentlich alles noch einmal überprüft aber irgendwo muss ja ein Fehler sein und ich bin einfach nur Blind.

Kann auch nochmal Code posten.
 

Neue Themen


Oben