Ich verwende ja gern Funktionen um Objekte fertig initialisiert zu erstellen.
Daher hab ich als ich mich an GUIs gemacht hab als Erstes dafür eine Funktion geschrieben.
Der folgende Code erstellt ein Fenster mit angegebenem Titel und Ausmaßen.
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
public static JFrame createFrame(String title, int width, int height){
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
if (d.height < height || d.width < width)
System.err.println("Window creation: Frame bigger than screen.");
JFrame win = new JFrame(title);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setSize(width, height);
win.setResizable(false);
win.setLocationRelativeTo(null); // Show window centered
// No title bar etc.
// win.dispose();
// win.setUndecorated(true);
// win.setVisible(true);
// Full Screen
// win.setLocation( 0, 0 );
// win.setSize( Toolkit.getDefaultToolkit().getScreenSize() );
win.setVisible(true);
return win;
}
Jetzt muss das Ganze natürlich noch aufgerufen werden:
// Window Size: x, y
int[] winSize = new int[]{830, 800};
JFrame mainwin = createFrame("Titel",winSize[0],winSize[1]);
// Set LookAndFeel to Nimbus (Looks better)
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch(Exception e) {
System.out.println("Error setting Nimbus LAF: " + e);
}
mainwin.setLayout(new FlowLayout());
JTabbedPane tabs = new JTabbedPane();
tabs.setPreferredSize(new Dimension(winSize[0],winSize[1]));
mainwin.add(tabs);
JPanel pHome = new JPanel();
tabs.addTab("Home", pHome);
JPanel pPlayer = new JPanel();
tabs.addTab("Player", pPlayer);
...
Wir haben nun ein schönes Tablayout mit dem wir arbeiten können.
Natürlich lässt es sich um beliebig viele Tabs erweitern.
Nützlich: Mit .setPreferredSize(Dimension d) lässt sich die Größe von einzelnen Elementen einstellen.
Nun macht es Sinn, die GUI als eigenen Thread laufen zu lassen.
Man kann so Aktualisierungen im Hintergrund laufen lassen.
Daher deklarieren wir die Klasse folgendermaßen:
public class Gui extends Thread{
// Vars
public Gui() {
JFrame mainwin = createFrame("Title", 800, 600);
// ... see above
}
@Override
public void run() {
// Do some refreshs ...
sleepG(1000);
}
}
Mit
public static void sleepG(int msec){
try {
Thread.sleep(msec);
} catch (InterruptedException e) {
System.err.println("Da hats doch grad nen sleep gekillt...");
e.printStackTrace();
}
}
Die InterruptedException muss schließlich aufgefangen werden.
Der Aufruf ist wie folgt:
Gui g = new Gui(); g.start();
Merke: Die Threadfunktion wird zwar als “run” deklariert, wird aber als “start” aufgerufen.
Mit g.run(); würden wir den Inhalt der Funktion sequentiell anstarten und nicht parallel in einem eigenen Thread.
Da wir in der GUI-Erstellung
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gesetzt haben, wird das gesamte Programm beim Schließen der GUI beendet.
Alternativ: .DO_NOTHING_ON_CLOSE


