# public boolean return



## Dagobert (26. Jun 2008)

Ich habe da mal so eine kleine Frage...
Ich habe in einer Klasse eine Methode die als Rückgabewert einen boolean erwartet.
Nun möchte ich aber, das dieser erst gesendet wird, wenn die linke Maustaste gedrückt wird (auf nem JPanel).
Wie stelle ich das nun an?
Ich habe mir überlegt das ich eine Klassenvariable anlege mit nem boolschem Wert und diese per listener änder.
In der Methode läuft eine while-Schleife die nur darauf wartet das die Variable auf ture gesetzt wird. 
Und dann gibt sie die Rückgabe.
Was sagt ihr dazu? Fällt euch eine bessere Idee ein?
mfg. Dagobert


----------



## SlaterB (26. Jun 2008)

> eine Methode die als Rückgabewert einen boolean erwartet. 

von wem? die Methode liefert selber den Rückgabewert, weil sie es so will,
da ist das etwas unglücklich formuliert 

------

dass eine Operation wartet und gleichzeitig noch eine GUI nicht-blockierend aktiv ist,
erfordert die Arbeit mit Threads, ziemlich komplizierte Sache,
wenn du das kannst, dann sollte sich eigentlich eine solche Frage nicht mehr stellen

jedenfalls klingt das ganz allgemein gesprochen durchaus denkbar,
'irgendwer' könnte warten, bis irgendwo anders eine Variable auf true geesetzt wird, ja,

idealerweise setzt du ein Thread.sleep(50) in die Warteschleife, sonst hast du maximale CPU-Auslastung


----------



## Marco13 (26. Jun 2008)

Hm - das mit der while-Schleife (auch mit einem Thread.sleep drin) ist "busy waiting", und das macht man eigentlich nicht - dafür ist ja der wait/notify-Mechsnismus von Java gedacht....


----------



## SlaterB (26. Jun 2008)

innerhalb einer Methode vor dem Rückgabewert wird das schwer,
dass man das generell anders besser bauen kann stimmt allerdings ganz bestimmt


----------



## Niki (26. Jun 2008)

Was ist daran kompliziert? Könnte so aussehen:


```
public static final Object MONITOR = new Object();

public boolean returnWhenMouseClicked(){
  synchronized(MONITOR){
    try{
      MONITOR.wait();
    }catch(InterruptedException ex){
    }
  }
  return true;
}

public class MouseHandler extends MouseAdapter{
  public void mouseClicked(MouseEvent e){
    synchronized(MONITOR){
      MONITOR.notifyAll();
    }
  }
}
```


----------



## tfa (26. Jun 2008)

wait() ohne Wait-Schleife sollte man nicht machen.
Du könntest auch Lock und Condition verwenden.


----------



## Niki (26. Jun 2008)

tfa hat gesagt.:
			
		

> wait() ohne Wait-Schleife sollte man nicht machen.



Da geb ich dir recht. Also so ist es besser:

```
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class WaitNotifyDemo extends JFrame {

	public static final Object MONITOR = new Object();

	private boolean clicked = false;

	public WaitNotifyDemo() {
		super("WaitNotifyDemo");
		guiInit();
		pack();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	private void guiInit() {
		JPanel p = (JPanel) getContentPane();
		p.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				synchronized (MONITOR) {
					clicked = true;
					MONITOR.notifyAll();
				}
			}
		});
	}

	public void waitTillClicked() {
		while (!clicked) {
			synchronized (MONITOR) {
				try {
					MONITOR.wait();
				} catch (InterruptedException e) {
				}
			}
		}
	}

	/**
	 * @param args
	 * @throws InvocationTargetException
	 * @throws InterruptedException
	 */
	public static void main(String[] args) throws InterruptedException,
			InvocationTargetException {
		final WaitNotifyDemo demo = new WaitNotifyDemo();
		SwingUtilities.invokeAndWait(new Runnable() {
			public void run() {
				demo.setVisible(true);

			}
		});

		new Thread(new Runnable() {
			public void run() {
				System.out.println("wait for click");
				demo.waitTillClicked();
				System.out.println("clicked");

			}
		}).start();
	}

}
```


----------



## Dagobert (26. Jun 2008)

Vielen Dankt erstmal für eure großartige und großflächige Hifel :toll: 

Ich seh schon ich sollte mich dafür tiefer in Threads einarbetien.  :### 
Thread. start/stop reicht dafür wohl nicht mehr aus.
Ob die GUI blockiert werden soll weis ich selber nicht nicht, ich bin ich noch am überlegen. 
Es geht darum das ich momentan einen Würfel Server/Client mache^^ (oder wie ich das nennen soll).
Also der Server erstellt soviele Zufallszahlen zwischen 1 und 6 wie Würfel vorhanden sind. Diese schickt er dann per SIMON (RIM) zu einer Methode am Client die die Grafische ausgabe übernimmt. Doch der Server soll erst weiter machen wenn die Wüfel vom Client weggeklickt wurden.
So ungefähr stelle ich mir das gerade vor...

mfg Dagobert


----------



## tuxedo (26. Jun 2008)

Oha. Netzwerkübergreifend blockieren? Das ist aber keine tolle Idee (damit hälst  du auch in SIMON nur unnötig Threads offen). Was spricht denn da gegen das Listener-Prinzip?

- Alex

P.S. (SIMON != RIM != RMI)


----------

