Swing Kombination von GUI-Elementen - Was mit wem ist erlaubt?

tsitra

Bekanntes Mitglied
Hallo allerseits,

mit Swing habe ich gerade angefangen und es gibt reichlich
Beispiele z.B. bei Trail: Creating a GUI With JFC/Swing (The Java™ Tutorials) an denen man schon viel lernen kann.

Wenn ich jedoch damit anfange eine GUI zu bauen, und dann mehrere verschiedene
GUI-Elemente benutze, also mit einander kombiniere, treten immer wieder Probleme
auf.

Zum Beispiel in, bzw. auf einem JFrame habe ich ein JTabbedPane und in einem Tab davon
ein JPanel und bei/auf letzterem eine JTabel und ein JButton btnXY.
Wss auch alles gut ging.
Jetzt wolte ich ein Dialog von diesem btnXY aus starten und bekam ein
Problem, weil bei Konstruktor des Dialog beim 1. Parameter (this) auf owner vom Typ Frame zeigen muss aber hier bei mir ist das wohl JPanel!?
Heisst das, dass das einfach nicht geht?

Wo gibt es kompakte(!) Übersicht, die darstellt,
in welcher Hierachie die grafischen Komponenten sich befinden und was mit was bzw, in was erlaubt ist ?
Am besten einfach so eine Menge von kurz gefassen Regeln.
Oder muss man sich das alles selbst erforschen?

Schoenen Dank für hilfreiche Hinweise.

Gruß
tsitra
 
Zuletzt bearbeitet:

delphiking1980

Bekanntes Mitglied
du kannst natürlich in der Klasse ein globale Variable von deinem JFrame anlegen und dann dieses an ein JOptionPane übergeben.

oder einfach NULL reinschreiben, klappt auch.
 

Marco13

Top Contributor
Bezüglich der allgemeinen "Regeln" müßtest du genauer werden. Das mit dem JDialog ist schon ein Spezialfall: Den "owner" (Frame oder Window) braucht ein Dialog, weil ein Dialog i.a. ein sehr spezielles Verhalten hat. Er ist ein Fenster, erscheint aber nicht in der Taskleiste. Mit dem "Owner" wird klar, wo er dazugehört. Insbesondere bei modalen Dialogen ist das wichtig: Erst wenn der modale Dialog geschlossen ist, kann der Frame weiterarbeiten und weiter benutzt werden. Bei nicht-modalen Dialogen kann man prinzipiell auch 'null' übergeben. Aber meistens ist es in solchen Fällen angebrachter, sich mit sowas wie SwingUtilities (Java Platform SE 6) ein Window als 'owner' zu holen. In diesem Fall würde man dort z.B. den Button übergeben, der den Dialog öffnet.
 

tsitra

Bekanntes Mitglied
Hallo Marco,

ich habe da nicht wenig rumgetüfftelt, aber eher Fehlermeldungen
(die mit scope und non-staic in a static context zu tun hatten) erhalten
, als dass ich einen Dialog
per Button, von von einer einzelenen Registerkarte "auf" einem JTabbedPane aus, öffen konnte.
Geht das eiugentlich wirklich? Müsste ja schon irgendwie...

.... Aber meistens ist es in solchen Fällen angebrachter, sich mit sowas wie SwingUtilities (Java Platform SE 6) ein Window als 'owner' zu holen. In diesem Fall würde man dort z.B. den Button übergeben, der den Dialog öffnet.

Soll ich also den JButton btnXY der den Dialog von einer einzelnen Registerkarte auf einem JTabbedPane aus an getWindowAncestor(); als Parameter übergeben?

also so:

SwingUtilities.getWindowAncestor( btnXY); ?

Viele Grüße
tsitra
 

Dit_

Bekanntes Mitglied
weil bei Konstruktor des Dialog beim 1. Parameter (this) auf owner vom Typ Frame zeigen muss aber hier bei mir ist das wohl JPanel!?
tsitra

Gibt es Compieler warnung oder Exception? Wäre von Vorteil wenn du die Fehlermeldung posten würdest oder Code

Mögliche Ursachen (gut dass ich die Glaskugel heute dabei habe :) )

1. du öffnest Dialog in einer Inneren Klasse.
2. diene Gui erbt nicht von JFrame

Versuche statt this ,
Code:
Gui.this
zu übergeben.

gruß :oops:
 

tsitra

Bekanntes Mitglied
Hallo allerseits,

das ist der Dialog, den ich aufrufen möchte:

[Java]
class GUIYesNoDialog extends Dialog implements ActionListener{

public GUIYesNoDialog(Window owner, String msg){

//super(owner, "Ja-/Nein-Auswahl", true); // deaktiviert da KEIN passender Konstruktor in Dialog //vorhanden

super(owner, "Ja-/Nein-Auswahl"); // Dialog-Konstruktor: "Dialog(Window owner, String title)"
...}

}
[/Java]

Innerhalb folgender class

[Java]
public class JTabbedPaneDemo1 extends JPanel implements ListSelectionListener,ActionListener,SwingConstants {
...
public static void main( String[] args )
{
...
JFrame frame = new JFrame("JTabbedPaneDemo1 !");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
...

JPanel objJPanel2 = new JPanel(null);
...
JButton btnEnde1 = new JButton("Ende");
btnEnde1.setBounds(100, 410, 90, 20);
btnEnde1.setBackground(Color.GREEN);
objJPanel2.add(btnEnde1);

Window wnd1 = SwingUtilities.getWindowAncestor(btnEnde1);
//Window ow = SwingUtilities.getWindowAncestor(this); nix da staticcontext

btnEnde1.addActionListener(new ActionListener(){
public void actionPerformed( ActionEvent e ){
Window wnd1 = SwingUtilities.getWindowAncestor(btnEnde1);
GUIYesNoDialog dial = new GUIYesNoDialog(wnd1,"");
}
});

}
}
[/Java]

dial.toString() liefert :
GUIYesNoDialog dialog0,80,80,124x82,hidden,layout=java.awt.BorderLayout,MODELESS,title=Ja-/Nein-Auswahl]


Eventuell sollte ich nicht erst von Dialog erben sondern direkt mit Dialog arbeiten!?

Gruß
tsitra
 

tsitra

Bekanntes Mitglied
Falls da (abgesehen vom letzten Satz) eine Frage drin war, solltest du die konkretisieren. ...

Hallo Marco,

und Danke nochmals. Meine Frage dreht sich um Dilalog, also ist auch das Dialog-tutorial interessant
bzw. relevant.

Eine meiner Fragen ist:
Was bedeutet diese Fehlermeldung die dial.toString() (siehe vorigen post) liefert :
GUIYesNoDialog dialog0,80,80,124x82,hidden,layout=java.awt.BorderLayout,MODELESS,title=Ja-/Nein-Auswahl]

Die 2. Frage ist, ob ich das irgendwie insgesamt falsch organiisiere.
Denn die ganzen Beispielprogramme von SUN bzw. Oracle erzeugen die Steuerelemente (Controls) meist oder immer im Konstruktor, leiten meist von JPanel ab und innerhalb der main() wird
ein JFrame erzeugt zu dem dann alles hinzugefügt wird.
Sicherlich ist das jedoch nur eine Frage des Stils, denn der Konstruktor wird schliesslich direkt oder ziemlich direkt auch innerhalb main(...) aufgerufen.

Ich habe jedoch verschiedene Programme die recht gut funktionieren und da passiert
quasi alles in main() (und im Konstruktor recht wenig, außer automatsich "super();"): Da werden also die Steuerelemente (Controls) erzeugt und zugeordnet und erhalten per .addActionListener(new ActionListener(){... ein ActionListener-Objekt als Anonymous Inner class und das klappt garnicht so schlecht...

Wo kann ich erfahren welche grundsätzlichen "Grundgerüste" bei GUI Erstellung mit Swing
korrekt sind und was nicht erlaubt ist.
Gemäß meiner iniitialen Frage nach einem Satz von Regeln die zu beachten sind.

Denn offenbar habe ich was unerlaubtes gemacht, denn das Problem begann damit, dass iich "auf
einem" JPanel der "auf einem" JTabbedPane-Tab ist KEINEN Dialog aufrufen konnte.

Die Idee mit " Window wnd1 = SwingUtilities.getWindowAncestor(btnEnde1);" ist bestimmt recht gut,
hat aber bei mir, da wohl falsch angewendet, bisher nur zu einer anderen Fehlermeldung geführt.

Viele Grüße
tsitra
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Eine meiner Fragen ist:
Was bedeutet diese Fehlermeldung die dial.toString() (siehe vorigen post) liefert :
GUIYesNoDialog dialog0,80,80,124x82,hidden,layout=java.awt.BorderLayout,MODELESS,title=Ja-/Nein-Auswahl]
Das ist keine Fehlermeldung. Das ist einfach nur der Versuch, einen Dialog in einen String to verwandeln. Wenn man sowas macht wie
Java:
JButton b = new JButton("Hallo");
System.out.println(b.toString());
erscheint auch ein "kryptischer" String...

Die 2. Frage ist, ob ich das irgendwie insgesamt falsch organiisiere.
Denn die ganzen Beispielprogramme von SUN bzw. Oracle erzeugen die Steuerelemente (Controls) meist oder immer im Konstruktor, leiten meist von JPanel ab und innerhalb der main() wird
ein JFrame erzeugt zu dem dann alles hinzugefügt wird.
...
Ich habe jedoch verschiedene Programme die recht gut funktionieren und da passiert
quasi alles in main()

Ganz allgemein sollte in der "main" so wenig wie möglich passieren. Bei einer Anwendung mit GUI steht in der main üblicherweise NUR
Java:
class GUI
{
    public static void main(String args[]) 
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        // JFrame erstellen
        // GUI-Hauptklasse erstellen (erbt meistens von JPanel)
        // GUI in Frame legen
    }
}
Die "Hauptklasse" des GUIs sollte i.a. eine Klasse sein, die von JPanel erbt und die dann nur in den Frame gelegt wird. Das ist (auf dieser, obersten Ebene) die flexibelste Struktur. Das, was in der main passiert, gehört nicht wirklich zum Programm (und so viel kann man da auch nicht machen, wenn man nicht irgendwelche Fields static machen will).

Denn offenbar habe ich was unerlaubtes gemacht, denn das Problem begann damit, dass iich "auf einem" JPanel der "auf einem" JTabbedPane-Tab ist KEINEN Dialog aufrufen konnte.

Die Idee mit " Window wnd1 = SwingUtilities.getWindowAncestor(btnEnde1);" ist bestimmt recht gut,
hat aber bei mir, da wohl falsch angewendet, bisher nur zu einer anderen Fehlermeldung geführt.
Wie schon gesagt, das WAR nicht unerlaubt, und du KONNTEST einen Dialog aufrufen (ohne Parent, aber das ist nur ein Detail). Die Fehlermeldung müßtest du nochmal genauer beschreiben (oder ich schaue mir den Code nochmal genauer an, wenn ich Zeit habe)
 

tsitra

Bekanntes Mitglied
Hallo Marco,

verzeih'....

Das ist keine Fehlermeldung. Das ist einfach nur der Versuch, einen Dialog in einen String to verwandeln. Wenn man sowas macht wie ...b.toString(); ...

Ja, völlig klar, ich hatte, weil der ersehnte Dialog immer nicht da war, wohl schon "gespenster gesehen":oops:

Ich hätte nur noch show() auf dial aufrufen müssen, also dial.show();, denn damit geht es jetzt.:toll:

Dein Tipp mit "SwingUtilities.getWindowAncestor(owner);" war soweit ich das jetzt überblicke, genau das was ich brauchte.

Eigentlich musste ich außerdem nur auf die Parameter-Typen der verwenden super-Konstruktoren
(die der Eltern-Klasse) achten und da entsprechend was anpassen, u.a. auch einen anderen alternativen Konstruktor nehmen.

Vielen Dank, nochmals.

Ganz allgemein sollte in der "main" so wenig wie möglich passieren. Bei einer Anwendung mit GUI steht in der main üblicherweise NUR...

Da genau ist u.a. noch mein Problem: Ich weiß nicht was man tun sollte und was üblich ist.
Ich habe wie erwähnt ein kleines Programm was recht gut funktioniert und da rufe
ich überhaupt kein Konstruktor der "Hauptklasse" des GUIs auf, sondern nur Konstruktoren der Steuerelemente, wie z.B. JButton und auch alles sonst ist nicht indirekt sondern direkt in main(...).
Aber das ist wohl schlechter Stil...!?

Viele Grüße
tsitra
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ja, kann man so sagen. Es funktioniert, hat aber den Nachteil, dass es recht unflexibel ist. Das Beispiel wirkt vielleicht etwas gestelzt, aber: Wenn du daraus jetzt ein JApplet machen wolltest... da GIBT es keine main-Methode (das müßte dann alles in die "init" gepackt werden). Mit den Klassen sollten ja "fuktionale Einheiten" gekapselt werden, und wenn alles in der main steht, ist es damit nicht so weit her...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JavaFX ListView in Kombination mit TextField AWT, Swing, JavaFX & SWT 5
H Kombination von zwei Frames AWT, Swing, JavaFX & SWT 16
P Swing JEditorPane in Kombination mit JScrollPane AWT, Swing, JavaFX & SWT 29
H AWT AffineTransform, Kombination von Translation und Rotation AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
J RadioButton-Gruppe in Kombination mit einem Button AWT, Swing, JavaFX & SWT 6
1 Buttons in Kombination mit Linien AWT, Swing, JavaFX & SWT 3
M Ansätze zur Kombination mehrerer Listener für Interaktion AWT, Swing, JavaFX & SWT 19
T Spaltenbreite bei jTabel in Kombination mit Srollbalken AWT, Swing, JavaFX & SWT 2
reibi Kombination AWT in SWT AWT, Swing, JavaFX & SWT 6
M Grafik in JFrame in Kombination mit Steuerelementen AWT, Swing, JavaFX & SWT 2
B Problem mit der Kombination von JScrollBar und JTextArea AWT, Swing, JavaFX & SWT 2
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
CptK Positionieren von Elementen in GridBagLayout AWT, Swing, JavaFX & SWT 4
G ObjectOutPutStream mit Javafx GUI Elementen AWT, Swing, JavaFX & SWT 14
N Array mit JavaFX Elementen AWT, Swing, JavaFX & SWT 9
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
K Automatische Skalierung von GUI Elementen (Java Swing) AWT, Swing, JavaFX & SWT 2
B Linie zwischen 2 Elementen AWT, Swing, JavaFX & SWT 5
D Anordnung von Elementen in JFrame AWT, Swing, JavaFX & SWT 2
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
S Shape erstellen der aus mehreren Elementen besteht..? AWT, Swing, JavaFX & SWT 3
N Probleme beim positionieren von Elementen AWT, Swing, JavaFX & SWT 2
G Swing MigLayout: Lücken zwischen Elementen entfernen AWT, Swing, JavaFX & SWT 2
K JList-Probleme beim Hinzufügen von Elementen AWT, Swing, JavaFX & SWT 3
N JFrame mit Elementen an die Bildschirmgröße automatisch anpassen AWT, Swing, JavaFX & SWT 3
U Swing JScrollPane + Panel drinne mit weiteren Elementen AWT, Swing, JavaFX & SWT 2
I Swing JPanel Tab zwischen GUI Elementen AWT, Swing, JavaFX & SWT 6
F JList füllen mit LinkedList-Elementen AWT, Swing, JavaFX & SWT 21
Strahlungsleck Swing Positionierung von Elementen im GridBagLayout AWT, Swing, JavaFX & SWT 2
Strahlungsleck Problem mit dem Anzeigen von Elementen im BorderLayout AWT, Swing, JavaFX & SWT 6
G JDialog mit mehreren Elementen! AWT, Swing, JavaFX & SWT 5
R Fokus von GUI-Elementen AWT, Swing, JavaFX & SWT 3
G Fixieren von Elementen in einem GridBayLayout AWT, Swing, JavaFX & SWT 4
D Hilfe bei GUI-Elementen in Java AWT, Swing, JavaFX & SWT 9
G Swing mit nativen (oder nativ aussehenden) Elementen AWT, Swing, JavaFX & SWT 4
D Freigabe von SWT Elementen AWT, Swing, JavaFX & SWT 2
W SWT, Anordung von Elementen - Layout Problem ? AWT, Swing, JavaFX & SWT 2
J JInternalFrame überlagert/unterlagert anderen Elementen AWT, Swing, JavaFX & SWT 2
B Abstand zwischen einzelnen Elementen einstellen AWT, Swing, JavaFX & SWT 2
M in JList nur Attribute von Elementen anzeigen lassen AWT, Swing, JavaFX & SWT 4
P Eventmanagement bei überlappenden Swing Elementen AWT, Swing, JavaFX & SWT 3
R Anfängerfrage:anzeige von Gui elementen AWT, Swing, JavaFX & SWT 2
G Ungewollter Abstand zwischen Gui -Elementen / Insets setzen AWT, Swing, JavaFX & SWT 2
N LayoutManager GridBagLayout schummeln erlaubt ? AWT, Swing, JavaFX & SWT 2
S JTable erlaubt kein Komma um Dezimazahlen einzugeben..? AWT, Swing, JavaFX & SWT 2
G add(Component) in paintComponent erlaubt ? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben