# Hintergrundframe sperren



## xKoRe (31. Jan 2012)

Hallo Freunde der Nacht,

mal wieder ich. Mein voriges Problem (sofern es jemand gesehen hat) habe ich gelöst bekommen, also falls jemand Fragen hat immer zu. 

Nun würde mich speziell etwas Neues interessieren. Ich weiss schon wie man ein Frame immer in den Vordergrund zwingt und auch wie man einen angepassten JDialog macht. Was mich speziell interessiert ist die Möglichkeit des JDialog, den Zugriff auf alle anderen Frames zu sperren. Mit anderen Worten: Der Frame muss erst "abgearbeitet" werden bevor es anderweitig weitergehen kann. Dies hätte ich gerne für ein normales JFrame. Da gibt es bestimmt einen Weg? 

Ich habe mich eben durch die JavaDoc gearbeitet, aber nichts passendes gefunden (vielleicht habe ich es übersehen). 

Greetz
xKoRe


----------



## bERt0r (31. Jan 2012)

Stichwort modaler Dialog. Einen JDialog kannst du mit setModal modal machen. Modal heisst, dass der Parent Frame des Dialogs nicht mehr reagiert, solange der Dialog offen ist.
Mehr als einen Frame zu sperren ist nicht so einfach: Dazu müsstest du quasi ein Flag speichern, und wenn dieses gesetzt ist, dürfen deine Frames nix mehr machen. Aber welche Anwendung hat denn mehr als einen Frame?


----------



## xKoRe (31. Jan 2012)

Ich merke wenn ich es einfach halten will, komme ich kaum um den Dialog herum. Es würde schon reichen ein Frame zu speichern. In diesem Fall das main frame. Ich will lediglich eine Art Menü öffnen können über das ich Einstellungen zum Mainframe vornehme. Das gibt nur eben Komplikationen wenn ich währenddessen auch am Mainframe Änderungen machen kann.

Thx for post


----------



## KrokoDiehl (31. Jan 2012)

Modale Dialoge sind doch genau dafür gemacht. Hier ein Kurzbeispiel das all das macht, was du dir wünschst  :


```
public final class ModalTest extends JFrame {

    public ModalTest() {
        super("ModalTest");
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        
        JButton button = new JButton("Dialog");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ModalTest.this.showDialog();
            }
        });
        
        this.add(button, BorderLayout.SOUTH);
        this.pack();
        this.setLocationRelativeTo(null);
    }
    
    private void showDialog() {
        final JDialog dialog = new JDialog(this, "ModalDialog");
        dialog.setModal(true);
        dialog.add(new JLabel("Versuch doch mal jetzt den Frame zu bearbeiten..."));
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.pack();
        dialog.setLocationRelativeTo(this);
        
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                dialog.setVisible(true);
            }
        });
    }
    
    public static void main(String[] args) {
        final ModalTest test = new ModalTest();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                test.setVisible(true);
            }
        });
    }
}
```


----------



## xKoRe (1. Feb 2012)

Danke für das nette Beispiel. Allerdings habe ich bereits einen modalen Dialog implementiert. Auch wenn ich nicht verstehe warum du dein "ModalTest" auf DISPOSE_ON_CLOSE gesetzt hast. So läuft das gute Programm leider einfach weiter...

Meinen Dialog habe ich individuell gestaltet, da er etwas mehr Inhalt hat, als die Standard Dialoge von Java bieten.

Hier ein kleiner Ausschnitt, falls es interessiert:


```
public class MemberWindow extends JDialog{
	
	private JList members;
	private JList players;
	private JButton removeMember;
	private JButton addToPlayers;
	private JButton removePlayer;
	private JButton renameMember;
	private JButton addNewMember;
	private JScrollPane playersScroll;
	private JScrollPane membersScroll;
	private JLabel membersLabel;
	private JLabel playersLabel;
	
	private int selectedMember;
	private int selectedPlayer;
	private ListManager lm;
	private MainWindow parent;
	
	public MemberWindow(ListManager lm, MainWindow parent){
		
		this.parent=parent;
		this.lm=lm;
		initializeComponents();
		initializeGUI();
		
	}
	
	public void initializeGUI(){
		this.setModal(true);
		this.setSize(500, 300);
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setTitle("Manage members & players");
		addComponentsToPane(this.getContentPane());
	}
```

Ich dachte nur, dass normale JFrames die Option setModal auch haben, dem ist nicht so, Thema erledigt!


----------



## KrokoDiehl (2. Feb 2012)

> So läuft das gute Programm leider einfach weiter...



Bei mir nicht


----------

