[Java] JFrame Fullscreen unter OsX

Lacritz

Lieutenant
Registriert
Okt. 2013
Beiträge
920
Heyho,

wie bereits im Titel beschrieben, habe ich das Problem das mein JFrame Fenster unter OSX nicht Fullsize geht, an sich öffnet sich ein Fenster, welches aber nur 1cm x 3cm ca groß ist.

Hier einmal der Code meines Programms

Class 1:

Code:
package Overlay;

import javax.swing.JFrame;

public class Frame extends JFrame{
	
	public static void main(String[] args){
		new Frame();
	}
	
	public Frame(){
		new JFrame();

		this.setTitle("Lacritz");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setVisible(true);
		this.setUndecorated(true);
	 	this.setExtendedState(MAXIMIZED_BOTH);
	 	
	 	
		 //	this.setLocationRelativeTo(null);
		 //	this.setSize(1680, 1050);
		
		Screen screen = new Screen(this);
		this.add(screen);
	}
		
}

CLASS 2:

Code:
package Overlay;

import javax.swing.JFrame;

public class Screen extends JFrame implements Runnable{
	
	Thread thread = new Thread(this);
	
	public Screen(Frame frame){
		thread.start();
	}
	
	

	public void run() {
		System.out.println("Success");
	}

}

Ggf. ebenfalls noch relevant sind Exceptions die mir angezeigt werden:

Code:
Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable.
	at java.awt.Frame.setUndecorated(Frame.java:828)
	at Overlay.Frame.<init>(Frame.java:18)
	at Overlay.Frame.main(Frame.java:8)

Hoffe ,dass mir jemand dabei helfen kann. Zum programmieren verwende ich einmal ein Macbook 13' mit Retina als Gerät und als IDE Eclipse. (Falls es Relevant ist wegen Displaygröße o.Ä.)
 
Hast Du Dir die API-Doku zu setUndecorated() durchgelesen? Die Exception könnte einen ansonsten auch auf die richtige Idee bringen.
 
Glaube du musst noch über "Toolkit" die Display Größe abfragen und per setSize zusätzlich setzen.

Code:
Toolkit.getDefaultToolkit().getScreenSize().getWidth()
 
Scheinbar ist es bei OsX so ,dass der Screen quasi weiter ist als die Anzeige, demnach wäre "MAXIMIZED_BOTH" Die native Auflösung und nicht die benutzte

Habe jetzt einmal

Code:
package Overlay;

import javax.swing.JFrame;

public class Frame extends JFrame{
	
	public static void main(String[] args){
		new Frame();
	}
	
	public Frame(){
		new JFrame();

		this.setTitle("Lacritz");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	
	        this.setSize(1680, 1050);  
	 //	this.setExtendedState(MAXIMIZED_BOTH);
		
		this.setUndecorated(true);
		this.setResizable(false);
		this.setVisible(true);
	 //	this.setLocationRelativeTo(null); 	
	 	
	
		Screen screen = new Screen(this);
		this.add(screen);
	}
		
}

gemacht und es läuft im Fullscreen, sprich habe es auf die Angezeigte Auflösung gemacht. Black90 danke aufjedenfall, du hast mich damit auf den richtigen Weg gebracht!
Ergänzung ()

Kriege jedoch weiterhin die Exceptions, aus denen ich nicht ganz schlau werde:

Code:
Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container

	at java.awt.Container.checkNotAWindow(Container.java:429)
	at java.awt.Container.addImpl(Container.java:1038)
	at java.awt.Container.add(Container.java:958)
	at javax.swing.JFrame.addImpl(JFrame.java:540)
	at java.awt.Container.add(Container.java:363)
	at Overlay.Frame.<init>(Frame.java:28)
	at Overlay.Frame.main(Frame.java:8)

Vermute das er mein "new JFrame();" nicht richtig nimmt - aber weswegen weiß ich in dem falle nicht
 
Zuletzt bearbeitet:
"new JFrame();" erstellt ein neues JFrame. Ansonsten passiert da nichts, da es nicht weiter verwendest. Mit der Klasse hat es also überhaupt nichts zu tun. Du wolltest vermutlich den Superkonstrucktor (super()) stattdessen verwenden?
 
Wieso erstellst du überhaupt ein "new JFrame()" ohne eine Instanz zu referenzieren. Wenn würde ich das new JFrame ganz am ende des Konstruktors setzen. Wobei sich mir der Sinn dieses Aufrufs nicht erschließt. In der Main erstellst du doch schon ein Frame, welches von JFrame erbt.
 
Eh, du extendest doch JFrame in der Klasse, d.h. sie erbt die Funktionalität eines JFrame und ist somit auch ein JFrame. Über this. bastelst du ja die Elemete da rein. This zeigt auf die Klasse in der du momentan den Code tippst. Kannst sogar das this weglassen. Das new JFrame() brauchst nimmer.

Wenn du irgendwo ein new machst, dann bitte nicht ins leere.
Frame f = new Frame() wäre besser. Somit kannst du immer über f auf das Frame Objekt zugreifen.

Ohne Pointer darauf (alle Variablen zeigen auf einen Speicherbereich), wäre es in C Speicherverschwendung bzw. ein Memory Leak. Leider kompensiert Java solch unsauberen Code :/
 
Zuletzt bearbeitet:
Zurück
Oben