LayoutManager Modalen JDialog ein Layout zuweisen

Mino1337

Mitglied
Hallo,

Ich möchte gern einem modalen JDialog ein CardLayout zuweisen.
Das geht auch nur zeigt er es nicht an.

Meine, noch nicht ganz fertige, Methode bekommt einen Frame und einen namen übergeben.
Der JFrame ist der spätere "parent", also der Frame der gesperrt wird durchs modal setzen, der String ist dazu da um die Methode für mehrere verschiedene Dialoge benutzen zu können.

so wie es dort steht Funktioniert es nicht, wenn ich "JDialog dialog;" jedoch zu einem frame oder window mache funktioniert es. Leider kann man diese nicht modal setzen -.- ...

Java:
JDialog dialog;

public Dialoge(JFrame f,String s) {
        if(s == "neueSammlung"){
           
            dialog = new JDialog(f);
            dialog.setTitle("Bla");
            dialog.setModalityType(ModalityType.APPLICATION_MODAL);
            dialog.setSize(new Dimension(400, 400));
            dialog.setResizable(false);
            dialog.setLocationRelativeTo(f);
            dialog.setVisible(true);
           
            dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            CardLayout layout = new CardLayout();
           
            JPanel a = new JPanel();
            JPanel b = new JPanel();
            JPanel c = new JPanel();
            JPanel d = new JPanel();
            JPanel k = new JPanel();
           
            a.setBackground(Color.red);
            b.setBackground(Color.yellow);
            c.setBackground(Color.blue);
            d.setBackground(Color.white);
           
            k.setLayout(layout);
           
            layout.addLayoutComponent(a, new String("erste"));
            layout.addLayoutComponent(b, new String("zweite"));
            layout.addLayoutComponent(c, new String("dritte"));
            layout.addLayoutComponent(d, new String("vierte"));
           
            k.add(a);
            k.add(b);
            k.add(c);
            k.add(d);
            dialog.add(k);
           
            layout.show(k, "erste");

            //textfeld = new JTextField(2);
            //a.add(textfeld);
           
        }
    }

Vielen Dank für eure Hilfe.
 
Man sollte grundsätzlich eine Komponente erst sichtbar machen nachdem das Layout erstellt wurde. Dies gilt insbesondere für modale Dialoge, denn dort gilt Folgendes:

Auszug aus der Javadoc:
setVisible(true): If the dialog is not already visible, this call will not return until the dialog is hidden by calling setVisible(false) or dispose.

Der Code der nach setVisible(true) steht wird also erst ausgeführt, nachdem der Dialog wieder geschlossen wurde. Daher darfst du das setVisible erst ganz am Ende ausführen.
 
Ah, ja jetzt Funktioniert es =D ... da soll mal einer drauf kommen -.- tststs ...
ich hätte da gleich noch ne frage hinterher =] ... gibt es ne möglichkeit ...

Java:
layout.show(container a, String a);

... diese Methode mit einem JDialog objekt anstatt einem JPanel zu machen ?

Bisher muss ich rumtrixen indem ich ein JPanel in den JDialog packe und in dieses widerrum das CardLayout, anders geht es nicht -.- ...
Ich war ja der Meinung das ein JDialog ebenso ein Container wie ein JFrame ist aber Java sieht das wohl anders ...
 
Eigentlich ist das Verhalten ja genau das was man bei einem modalen Dialog haben möchte: Die Ausführung im "Hintergrund" wird unterbrochen und erst wieder aufgenommen wenn der Dialog geschlossen wurde.

Zu deinem anderen Problem: Du hast Recht mit der Annahme das ein JDialog auch ein Container ist. Bei Fenstern und Dialogen gibt es allerdings verschiedene Ebenen wo Komponenten platziert werden können (https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html). Durch Hinzufügen einer Komponente zum Dialog wird diese nicht direkt in den Dialog gelegt, sondern in die ContentPane. Versuch es also mal mit
Java:
layout.show(dialog.getContentPane(), "erste");
 

Neue Themen


Zurück
Oben