# Fenster sperren



## Heinz Schenker (6. Mai 2008)

Hallo,

ich hab eine Java-Swing Anwendung, wo ein Fenster geöffnet wird. Dort soll der Benutzer eine Auswahl treffen und OK oder Abbrechen klicken.

Wie kann ich verhindern, daß der Benutzer das Fenster einfach wegklickt und zum Hauptframe zurückkehrt ?


----------



## krel (6. Mai 2008)

Indem du dein Fenster vom JDialog ableitest und im Konstruktor folgendes zuerst ausführt

```
super(new JFrame(), true);
```
wenn du sowieso nen JFrame als parent mit übergibst kannst auch den benutzen. Weiteres erfährst du in der API


----------



## Heinz Schenker (7. Mai 2008)

Es ist aber ein eigenes vom JFrame abgeleitetes Optionsfenster, wo der Benutzer Checkboxen und Radiobuttons selektieren kann.
Hm...aber wenn ich deinen Satz nochmal lese, dann ist das egal, dann leite ich halt einfach von JDialog ab.

Das probier ich gleich aus, ich alter Schlaumeyer und HansDampf aus allen Gassen 

Ich dachte ein JDialog ist nur eine Meldung mit einem Text, die man dann mit OK bestätigt und dann ist sie weg.


----------



## Heinz Schenker (7. Mai 2008)

Tja, klappt nicht...

So sieht mein "KOT" grade aus. Es ist jetzt halt das AboutFenster, nicht das Optionsfenster, aber egal. Das Optionsfenster hat halt Checkboxen statt Beschriftungen. Und noch die Buttons Abbrechen, Übernehmen.


```
public class AboutFrame extends JFrame implements ActionListener
    {
        AboutFrame()
        {
            super();
            this.setSize(200,200);
            this.setLocation(300,300);
            this.setUndecorated(true);
            this.setVisible(true);
            
            
            JButton b1 = new JButton("OK");
            b1.addActionListener(this);
            
            JPanel p1 = new JPanel();
            p1.setLayout(new GridLayout(5,1));
            
            JLabel l1 = new JLabel("Beschriftung");
            JLabel l2 = new JLabel("Beschriftung");
            JLabel l3 = new JLabel("Beschriftung");
            JLabel l4 = new JLabel("Beschriftung");
            
            p1.add(l1);
            p1.add(l2);
            p1.add(l3);
            p1.add(l4);
            p1.add(b1);
            
            this.add(p1);
        }

        public void actionPerformed(ActionEvent e)
            {
                if (e.getActionCommand()=="OK")
                    {
                       this.dispose();
                    }
                
            }
        
    }
```


----------



## Wildcard (7. Mai 2008)

Der einzige Unterschied von JDialog zu JFrame ist, das ein JDialog keinen Eintrag im Panel/ in der Taskleiste (wie auch immer das auf deinem Betriebsystem heißt) erzeugt und modal sein kann (und Modalität brauchst du).
Also erb von JDialog statt von JFrame


----------



## Quaxli (7. Mai 2008)

Ein Beispiel: Zunächst Deine Klasse. Ich habe das setVisible(true) verschoben und danach noch eine Zeile eingefügt:


```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import javax.swing.*;

public class AboutFrame extends JFrame implements ActionListener {
	
	public static void main(String[] args){
		new AboutFrame();
	}
	
	public AboutFrame() {
		super();
		this.setSize(200, 200);
		this.setLocation(300, 300);
		this.setUndecorated(true);

		JButton b1 = new JButton("OK");
		b1.addActionListener(this);

		JPanel p1 = new JPanel();
		p1.setLayout(new GridLayout(5, 1));

		JLabel l1 = new JLabel("Beschriftung");
		JLabel l2 = new JLabel("Beschriftung");
		JLabel l3 = new JLabel("Beschriftung");
		JLabel l4 = new JLabel("Beschriftung");

		p1.add(l1);
		p1.add(l2);
		p1.add(l3);
		p1.add(l4);
		p1.add(b1);

		this.add(p1);
		this.setVisible(true);   // <<<< setVisible als Letztes!!!
		
		new Stop(this);
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand() == "OK") {
			this.dispose();
		}

	}

}
```

Die Zeile new Stop instanziiert die folgende Klasse:


```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


public class Stop extends JDialog implements ActionListener{
	
	public Stop(JFrame fram){
		super(fram,true);
		setSize(200,200);
		setLocation(200,200);
		getContentPane().setBackground(Color.red);
		setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
		setLayout(new GridLayout(3,1));
		
		add(new JLabel("Dieser Hinweis"));
		add(new JLabel("blockiert den JFrame"));
		
		JButton go = new JButton("weiter");
		go.setActionCommand("go");
		go.addActionListener(this);
		add(go);
		
		
		setVisible(true);
	}

	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("go")){
			dispose();
		}
	}

}
```
Ist alles mit der heißen Nadel gestrickt, sollte als Demo aber reichen


----------



## Escorter (7. Mai 2008)

Heinz Schenker hat gesagt.:
			
		

> Tja, klappt nicht...
> 
> So sieht mein "KOT" grade aus. Es ist jetzt halt das AboutFenster, nicht das Optionsfenster, aber egal. Das Optionsfenster hat halt Checkboxen statt Beschriftungen. Und noch die Buttons Abbrechen, Übernehmen.
> 
> ...



Du solltest von JDialog ableiten


```
public class AboutFrame extends JDialog implements ActionListener
    {
        AboutFrame(JFrame owner)
        {
            super(owner,true);
...
```

Als owner übergibts du den JFrame (oder eine abgeleitete Klasse), die den JDialog aufruft.

Gruß,
Esco


----------



## Heinz Schenker (7. Mai 2008)

SUPER ! Es FUNZT wie eine funzelige Funzel !!!

Ganz wichtig an alle die das Beispiel nachvollziehen wollen.

setVisible(true) MUSS (!) in der letzten Zeile stehen !

Der Sräd kann mit Haken versehen werden. (Wo macht man das ?)


----------



## Gast (7. Mai 2008)

Geht als Gast nicht


----------

