Vergleich und Unterschied zwischen JFrame und JDialog in Java



Hallo Leute, bei unserem letzten Thema haben wir die Einführung mit der Programmierung der Grafischen Benutzeroberflächen in Java und die ersten Erfahrungen der JFrame gemacht. Dies könnt ihr euch natürlich, für diejenigen die es verspasst haben, >>HIER<< anschauen.
Heute möchte ich mit euch weitere Methoden über den JFrame, JDialog und ein kleines Vergleich zwischen diese beiden Funktionen stellen.

Folgende Funktionen zur Erstellen eines Frames steht dem Java-Developer zur Verfügung:
setSize(x, y)
Mit der Methode setSize() wird die Größe eines Frames in x-y-Richtung bestimmt. Dabei ist der Ursprung die Obere linke Ecke des Displays mit den Koordinaten O = ( 0 / 0 ) mit x = 0 und y = 0. Der dazugehörige Maßstab ist in Pixel. 1 = 1Pixel.

setLocation(x, y)
Mit dieser Methode wird die Position des Fensters angegeben in dem sich das Fenster beim starten des Programms befinden soll. Dabei ist die x-y-Koordinaten die Entfernung vom Ursprung zu der Obere linke Ecke des Fensters.

setBounds(x, y, width, height)
Mit der Methode setBounds() erreichen wir den Aufruf der beiden Methoden setSize() und setLocation() gleichzeitig was uns die Schreibarbeit spart.

Bei unserem letzten Beispiel haben wir ebenfalls das Schließen von Fenster behandelt in dem wir es steuern können, ob das Programm nach dem Schließen des Fensters Beendet werden soll, also vom Speicher gelöscht werden soll, oder ob das Programm im Hintergrund weiter ausgeführt werden soll. Um diesen Vorgang zu kontrollieren, bietet uns Java die Methode setDefaultCloseOperation(), was ich auch bei unserem Einführung zu den GUIs erörtert habe. Ich habe jedoch nicht alle Funktionen dieser Methode mit euch besprochen nur den EXIT_ON_CLOSE und die Standarteinstellung HIDE_ON_CLOSE. Dabei gibt es noch zwei weitere, die ebenfalls wichtig sind wie die beiden selber. Es handelt sich nämlich um das sogenannte DO_NOTHING_ON_CLOSE und DISPOSE_ON_CLOSE.
Nochmals möchte ich für den Quereinsteiger die Begriffe samt der, welches wir letztes mal besprochen haben, erörtern.
JFrame.HIDE_ON_CLOSE: Macht den Frame unsichtbar sobald diese Geschlossen wird aber das Programm läuft im Hintergrund weiter. Als Beispiel können wir den Instant Messenger Client Skype nehmen. Sobald Sie Skype heruntergeladen haben und dieses gestartet haben, können sie ja schreiben, telefonieren und auch Videotelefonie durchführen. Wenn sie aber fertig sind, dass schließen sie das Fenster. Sie möchten ja nicht, dass unten in der Symbolleiste Programme laufen, die sie nicht brauchen. In der Wirklichkeit schließen sie jedoch nur das Fenster und nicht das Programm. Das Programm läuft im Hintergrund immer weiter bis wir es selber Beenden oder den Computer Herunterfahren. Genau da kommt das Befehl setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE) ins Spiel. Im Quellcode von Skype wurde nämlich dieses Befehl vermerkt. Schließe nur das Fenster aber beende das Programm nicht.

JFrame.DO_NOTHING_ON_CLOSE:
Das Fenster wurde für Anwendungen geeignet, die nur dann kommen, sobald diese laufen um dies dem Benutzer mitzuteilen. Beispielsweise starten wir ein Installationsprogramm welches ein Programm in unserem Computer installieren soll. Wir können dieses Fenster bei der Installationsvorgang nicht beenden. Erst nach dem dieses Vorgang abgeschlossen ist, schließt dieses sich selber. Natürlich gibt es in der Wirklichkeit Betrüger, die sich dieses Wissen für Betrügerische Zwecke benutzen in dem Sie eine Anwendung starten bei denen dieses Befehl markiert ist. Wir Surfen im Internet und auf einmal erscheint ein Fenster mit einer Betrügerischen Meldung, dass Unserer Rechner infiziert ist und wir diese Nummer anrufen sollen. Mindestens einmal im Leben kam jeder zu dieser Situation. Natürlich will jeder dieses Fenster schließen. Doch was nun? Es geht nicht, weil das Befehl JFrame.DO_NOTHING_ON_CLOSE was auf Deutsch „mach nichts wenn der Benutzer schließen will“ bedeutet.

JFrame.EXIT_ON_CLOSE:
Das Fenster sowie das Programm wird nach dem Schließvorgang komplett beendet und vom Speicher gelöscht.

JFrame.DISPOSE_ON_CLOSE:
Dieses zerstört den Frame wenn dieses auch der letzte Frame der Anwendung war und beendet die VM (Virtual Machine) danach.

Zu den weiteren Funktionen eines Frames gehören auch natürlich die sogenannten Icons. Alle Software haben ihr eigenen Icon. In der Praxis gibt es also keine Software oder Anwendungen, die kein Icon haben. Um das Icon unserer Anwendung zu setzen, müssen wir einfach die Methode setIconimage(Image image) aufrufen.
Beispielsweise würde ein einfaches Frame mit einem Icon wie folgt aussehen:
public class FensterMitIcon {
      
       public static void main(String[] args) {
            
             JFrame f = new JFrame():
             f.setTitle("Fenster");
             f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             f.setBounds(100, 100, 500, 500);
            
             ImageIcon i = new ImageIcon("Hier den Pfad des Bilds angeben.jpg oder .png");
             // Java akzeptiert alle Bildformate
             f.setIconImage(i.getImage());
             f.setVisible(true);
       }
}

Hintergrundfarbe eines Fensters:

Bis jetzt haben wir Fenster entwickelt mit nur weißen Hintergrundfarbe. Dabei ist nur weiße Hintergrundfarben meistens langweilig. Daher bietet uns Java und andere Programmiersprachen eine Funktion, mit dem wir die Hintergrundfarbe auswählen können. In Java lautet diese Methode JFrame.getContentPane.setBackground(Color c).

JFrame myFrame = new JFrame();
myFrame.getContentPane().setBackground(Color.BLUE);

Die Angabe der Farben müssen wir immer in Großbuchstaben schreiben wie z.B. RED, WHITE, BLACK, YELLOW, MAGENTA, GREEN etc..

Das sind die Grundlegenden Funktionen/Methoden eines Frames, welches wir immer brauchen werden. Im Verlauf werden wir daher immer neue Funktionen lernen.


Dialoge zwischen dem Programm und dem Benutzer mit JDialog:

Dialoge unterscheiden sich von normalen Frames im Grunde nur dadurch, dass das Hauptfenster eines Programmes deaktiviert ist, solange der Dialog offen ist.
Konkret heißt das, dass der Code nach der Zeile setVisible(true) nicht weiter ausgeführt wird, bis der JDialog geschlossen wird. Außerdem werden Dialoge nicht in der Taskleiste angeteigt. Ein Dialog wird in Java durch die Klasse JDialog im Paket javax.swing repräsentiert. Der Standartkonstruktor von JDialog lautet JDialog(). Dann verhält er sich wie ein JFrame, nur das er nicht in der Taskleiste erscheint.

Die weiteren Konstruktoren sind:

JDialog(JFrame owner):
Owner bezeichnet den Frame, aus dem der Dialog ausgerufen wird. Unter anderem bewirkt das, dass der Dialog genau dem übergebenen Fenster erscheint.

JDialog(JFrame owner, String title):
Setzt zusätlich den Titel des Dialoges.

JDialog(JFrame owner, String title, boolean model):
Setzt auch die Modalität des Dialoges.

Es gibt noch mehr von diesen Konstruktoren, die sich allerdings nur dadurch von den hier aufgelisteten unterscheiden, in dem sie keinen JFrame als besitzer annehmen. Sondern entweder einen anderen JDialog, oder ein Window. Dies sind die Mutterklassen aller Fensterklassen von Swing und AWT.
Wenn ihr kein Besitzer angeben wollt oder die anderen beiden Eigenschaften aber über den Konstruktor setzen wollt, müssen wir uns mit einem Trick weiterhelfen. Naheliegend wäre in diesem Fall, einfach den Konstruktor mit JDialog(null, “DIALOG“, true) aufzurufen.
Dies wird aber Fehler melden, weil der Compiler in diesem Fall nicht weis, welchen Konstruktor wir in Wirklichkeit meinen. Es kommen ja in diesem Beispiel drei infrage. Deshalb müssen wir dem Compiler es sagen, welches wir meinen und welches er aufrufen soll. Dazu wandeln wir dieses null einfach in ein JFrame, JDialog oder JWindow um.

Hier noch ein Beispiel für das Darstellen eines Dialoges ohne Besitzer-Fenster. Alle beiden Beispiele wurden auf GitHub hochgeladen. Ihr könnt es >>HIER<< Runterladen.  

package java2enterprise;
import javax.swing.JDialog;

public class main{
      
       public static void main(String[] args) {
            
             JDialog d = new JDialog((JFrame)null, "Mein Dialog", true);
             d.setBounds(100, 100, 300, 300);
             d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
             d.setVisible(true);
             System.out.println("Dialog geschlossen");
       }
}

Kommentare

Beliebte Posts aus diesem Blog

How can I transform a .jar file to a .bat file?

Ein Kleines Spiel mit Altersabfrage

Zufallszahlen und Verzweigungen in Python