Toon posts:

[JAVA] Wacht tot dat button is geselecteerd: loop

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Een vraagje, denk dat er een simpel antwoord voor te vinden is maar deze heb ik helaas nog niet gevonden.

Ik heb een loop (lus) nodig die wacht totdat mijn button is geselecteerd. Hij moet dus in deze loop blijven zitten en niet verder gaan met de rest van mij applicatie.

Ik heb al dingen geprobeerd zoals met while () te werken maar dit is ook niet gelukt.
Java:
1
2
3
4
5
6
Action c = jButton1.getAction();

while ( c != null ) {

System.out.println("wacht")
}


Maar dit werkt ook niet. Hij gaat vrolijk verder.
Iemand suggesties voor een aanpak die wel zal werken?
De button staat in een frame class die ik oproep met mijn main class.

Gr Azi

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Euhm.... waarom wil je dit doen?
Waarom gebruik je de events van die button niet?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Een action event bedoel je?
Daar maak ik ook gebruik van. Maar dan gaat hij wel gewoon door met
met mijn app.

Er zal best wel een fout in mijn main class zitten waardoor hij dus niet stopt totdat hij alles heeft afgehandeld. Het probleem is dat hij alle GUI frames oproept die ik gebruik in mijn java app. Al die oproepen staan in mijn main class die verwijzen naar de frame classes die mijn GUI's bevatten.

De bedoeling is echter dat hij na de eerste GUI (een simpele message box) stopt. Totdat er een button is geselecteerd in mijn message box. Enigste wat ik dus kan bedenken voor dit probleem is om een lus te maken. Zodat hij dus in deze lus blijft totdat hij een waarde krijgt van een geselecteerde button die gelijk is aan die while() ofzo.

Heb geen andere oplossing. Dus eigenlijk zoek ik een beetje naar welke keuzes ik heb qua loops enzo om dit probleem op te lossen.

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Wat je bedoelt is misschien zoiets als:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainClass
{
   public static void main(String [] args)
   {
      TestFrame frame1 = new TestFrame(this);
      TestFrame frame2 = new TestFrame(this);

      frame1.show();
      try
      {
         wait(this);
      }
      catch(Exception e) // vervangen door normaal gegooide exception 
      {
         // doe exception handling..
      }
      frame1.dispose();
      frame2.show();
   }
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class TestFrame extends JFrame
{
   JButton button = null;
   Object lock = null;

   public TestFrame(Object _lock)
   {
      this.lock = _lock;
      button = new JButton();
      button.addActionListener( new ActionListener()
                                {
                                   public void actionPerformed(ActionEvent e)
                                   {
                                      try
                                      {
                                         notifyAll(lock);
                                      }
                                      catch(Exception ex)
                                      {
                                         // doe hier wat exception handling
                                      }
                                   }
                                });

      this.getContentPane().add(button);
   }
}


Heb deze code overigens niet getest. Het kan dus zijn dat er eea fout is. Zal ook vast niet de netste oplossing zijn.

[ Voor 3% gewijzigd door Dash2in1 op 13-11-2003 16:33 ]


Verwijderd

Kan je niet een FocusListener aan je main (of button) hangen en pas in de methode focusGained() de andere gui elementen creëren?

dus zoiets:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Main implements FocusListener
{
      Button b = new Button();

      public static void main(String args[])
      {
            // ... de code
            b.addFocusListener(this);
      }

      public void focusGained(FocusEvent e)
      {
            if(e.getSource() == b)
            // maak de andere gui elementen
      }
}


(Of je add de focusListener in je button)

Nu doet ie niks totdat je button geselecteerd is. Of gebruik een modal dialog. Dan wacht de applicatie tot deze is afgesloten.

[ Voor 14% gewijzigd door Verwijderd op 14-11-2003 00:51 ]


Verwijderd

Topicstarter
Ik doe nu het volgende

Eerst even uitleggen wat mijn code nou doet

1. Start() gaat naar mijn (C) library (Java native interface)
2. Mijn library roept met een callback function Mbox() method op uit mijn main java class
3. Deze Mbox() maakt een frame aan en roept de class MBoxFrame() op om deze frame in te vullen.
4. Deze MBoxFrame() bevat de actionListener van mijn button.
(5. Daarna gaat mijn app dus vrolijk verder)

Ik heb nu in mijn main class het volgende stukje code gezet.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
boolean c = false;

  private void Mbox() {

    MBoxFrame frame = new MBoxFrame();
    //Validate frames that have preset sizes
    //Pack frames that have useful preferred size info, e.g. from their layout
    if (packFrame) {
      frame.pack();
    }
    else {
      frame.validate();
    }
    //Center the window
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension frameSize = frame.getSize();
    if (frameSize.height > screenSize.height) {
      frameSize.height = screenSize.height;
    }
    if (frameSize.width > screenSize.width) {
      frameSize.width = screenSize.width;
    }
    frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
    frame.setVisible(true);

//loop om te wachten tot de boolean c true wordt.

while ( c != true)
{
    try {
        Thread.currentThread().sleep(50);
        System.out.println(""+c+"");
     }

    catch(Exception e) {
        e.printStackTrace();
     }
}


Nu stopt hij dus mooi nadat hij mij MBoxFrame heeft opgeroepen en beland vervolgens in een loop.

Nu is mijn vraag hoe ik die boolean "c" middels mijn actionListener van mijn button kan veranderen in "true"?

Java:
1
2
3
4
5
  void mijnButton_actionPerformed(ActionEvent e) {

//Verander de boolean c in true en maak hem available voor mijn main class

  }


Dus dit betekent als ik op die knop druk boolean c in true verandert ( hij is nu false). En dus de code zo kan maken dat hij daarna pas verder gaat met de andere GUI's.

Gr

[ Voor 5% gewijzigd door Verwijderd op 14-11-2003 10:10 ]


Verwijderd

Wat je zou kunnen doen is een boolean variable van het frame checken.
Dus in je while loop:
Java:
1
2
3
while( !frame.getBoolean() )
{
}


En dan in je MBoxFrame:
Java:
1
2
3
4
5
6
7
8
9
10
11
boolean c = false;

public void actionPerformed( ActionEvent e )
{
 c = true;  
}

public boolean getBoolean()
{
 return c;
}

Verwijderd

Topicstarter
Echt bedankt!!

Verwijderd

Topicstarter
Ja alleen sluit mijn frame GUI dan niet wanneer ik me button heb geselecteerd maar dat zou wel niet zo moeilijk zijn neem ik aan :P

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

Kewl, een busy wait loopje.. En dan vervolgens afvraagen waarom je app 100% processortijd neemt.......

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Heb je ook een alternatief dan????

[ Voor 79% gewijzigd door Verwijderd op 14-11-2003 11:34 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Ja, zie wat ik eerder postte.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Threads :)

Verwijderd

Janoz schreef op 14 november 2003 @ 11:24:
Kewl, een busy wait loopje.. En dan vervolgens afvraagen waarom je app 100% processortijd neemt.......
Ff mijn code snippet verdedigen :)

Java:
1
Thread.currentThread().sleep(50); 


Dus dat zou er wel voor moeten zorgen dat het systeem niet 'bezet' raakt. Plus dat er verder niks gebeurt in de loop dus het zal wel allemaal lost lopen. Het kan natuurlijk mooier, maar ik heb dit toen gepost naar aanleiding van een vrij vage vraag. Mooi dat het toch werkt :P

  • drice
  • Registratie: December 2000
  • Laatst online: 16:05

drice

Loading...

wait - notify misschien

wacht het programma net zolang totdat jij een notify stuurt en dan pas verder gaat

Did you know that IF is a middle word in life. "Ja maar wie ben ik om aan mezelf te twijfelen"


  • Helox-in-a-box
  • Registratie: Augustus 2000
  • Laatst online: 01:01
of de Dialog gebruiken die Modale is, de onderliggende code wacht dat tot de Dialog is gedisposed/gesloten.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Helox-in-a-box schreef op 17 november 2003 @ 11:26:
of de Dialog gebruiken die Modale is, de onderliggende code wacht dat tot de Dialog is gedisposed/gesloten.
Niet helemaal :) De event dispatching thread die verwerkt geen events meer van andere schermen dan het modal scherm. Maar de thread die de main opstart != event dispatching thread.

  • Helox-in-a-box
  • Registratie: Augustus 2000
  • Laatst online: 01:01
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.awt.*;
import java.awt.event.*;

public class Main extends Frame implements ActionListener {
    private MyDialog dialog;

    public Main() {
        setBounds(400, 500, 50, 50);
        setVisible(true);
        dialog = new MyDialog(this, true);
        dialog.button.addActionListener(this);
        dialog.setVisible(true);
        System.out.println("Dialog disposed");
    }

    public static void main (String args[]) {
        Frame frame = new Main();
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());
        if (dialog != null) dialog.dispose();
    }
}
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
import java.awt.*;


public class MyDialog extends Dialog {
    public Button button = new Button("test");
    public MyDialog (Frame parent, boolean modal) {
        super(parent, modal);
        add(button);
        setBounds(400, 500, 50, 50);
    }
}


ff snel wat getikt, dit werkt bij mij, actionListener is de mainframe, frame wacht tot de dialog is gedisposed.

[ Voor 77% gewijzigd door Helox-in-a-box op 17-11-2003 17:00 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

En maak nu maar eens een modal dialog en open vanaf je main. Je main gaat gewoon door. De event dispatching thread!=main thread.

*zit nu ook ff diep na te denken.... zometeen maar eens ff testen :P*

[ Voor 25% gewijzigd door Alarmnummer op 18-11-2003 09:51 ]


  • Helox-in-a-box
  • Registratie: Augustus 2000
  • Laatst online: 01:01
Alarmnummer schreef op 18 november 2003 @ 09:50:
En maak nu maar eens een modal dialog en open vanaf je main.
dus je maakt een mainwindow aan en die maakt een modal dialog aan? of omgekeerd, een modal window creeert een nieuwe window?
of een dosbox die een modal dialog aanmaakt (imo beetje nutteloos :)).

snap je zin niet helemaal ;)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Helox-in-a-box schreef op 18 november 2003 @ 12:41:
[...]

dus je maakt een mainwindow aan en die maakt een modal dialog aan? of omgekeerd, een modal window creeert een nieuwe window?
of een dosbox die een modal dialog aanmaakt (imo beetje nutteloos :)).

snap je zin niet helemaal ;)
Het topic daalt per minuut in nivo.

  • Helox-in-a-box
  • Registratie: Augustus 2000
  • Laatst online: 01:01
Alarmnummer schreef op 18 november 2003 @ 09:50:
En maak nu maar eens een modal dialog en open vanaf je main
je kan geloofik vanaf je main niet een dialog creeren, een dialog heeft een parent frame nodig.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Helox-in-a-box schreef op 18 november 2003 @ 16:26:
[...]
je kan geloofik vanaf je main niet een dialog creeren, een dialog heeft een parent frame nodig.
Je kan uitstekend een dialog maken vanaf je main. Een parent is niet nodig, je geeft gewoon een null als parent mee.

  • Helox-in-a-box
  • Registratie: Augustus 2000
  • Laatst online: 01:01
Alarmnummer schreef op 18 november 2003 @ 16:28:
Een parent is niet nodig, je geeft gewoon een null als parent mee.
hm raar, krijg dan deze melding:
code:
1
2
3
4
5
6
7
8
9
Exception in thread "main" java.lang.IllegalArgumentException: null owner window

        at java.awt.Window.ownedInit(Unknown Source)
        at java.awt.Window.<init>(Unknown Source)
        at java.awt.Dialog.<init>(Unknown Source)
        at java.awt.Dialog.<init>(Unknown Source)
        at MyDialog.<init>(MyDialog.java:7)
        at Main.<init>(Main.java:8)
        at Main.main(Main.java:14)


krijg het gevoel dat we te ver doorgaan wat betreft de vraag van azithug :P

[ Voor 16% gewijzigd door Helox-in-a-box op 18-11-2003 17:17 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Het mag wel als je gebruik maakt van een JDialog.
Pagina: 1