[JAVA] focus handling jdk1.1.8

Pagina: 1
Acties:

  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:25

momania

iPhone 30! Bam!

Topicstarter
Probleem:

Bij het tonen van een popup krijgt deze popup de focus maar verlies deze direct weer.
Het proberen af te vangen van het focusLost event heeft hier ook geen succes, omdat die op de een of andere manier niet optreed.
Het probleem is volgens mij dat het in de oude jvm zit, en er is geen optie om te udaten naar een nieuwere versie, dit ivm omgeving waarom de applicatie draait(OS/2, jdk1.1.8 v. 3) en omdate het over 2 weken af moet zijn. :(

Is er iemand die hier ervaringen mee heeft en toevallig dan ook een oplossing kan aanbieden??

Neem je whisky mee, is het te weinig... *zucht*


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Popup? Je bedoelt een dialoog als child van een Frame? Of een Popup menu?

Heb je enig idee waarom de focus verloren gaat en waar hij dan wel heen gaat?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

mmmm... Volgens mij kun je een java.awt.Component wel vertellen dat ie de focus moet hebben. Kijk anders ff in de sourcecode, keurig verpakt in het bestand src.zip bij je SDK.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Beter idee: pak de API docs. Daar vind je een methode requestFocus(). Maar die begint niet voor niets met request...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:25

momania

iPhone 30! Bam!

Topicstarter
Op maandag 22 oktober 2001 17:51 schreef mbravenboer het volgende:
Popup? Je bedoelt een dialoog als child van een Frame? Of een Popup menu?

Heb je enig idee waarom de focus verloren gaat en waar hij dan wel heen gaat?
Het gaat hier om een modal JDialog met als parent het hoofd frame, eigenlijk heel simpel.
Op de achtergrond in het hoofd frame hangt een panel die dynamisch gevuld wordt en ook heel veel dingen met de focus doet, maar dat hebben we allemaal lopen tracen en debuggen, maar we zijn het helemaal kwijt. :?

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Ah, dus we zijn met Swing bezig !!! :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
momania: Het gaat hier om een modal JDialog met als parent het hoofd frame, eigenlijk heel simpel.
Idd...
Op de achtergrond in het hoofd frame hangt een panel die dynamisch gevuld wordt en ook heel veel dingen met de focus doet, maar dat hebben we allemaal lopen tracen en debuggen, maar we zijn het helemaal kwijt. :?
Hum als dat panel de focus aanvraagt ben je normaal gesproken alleen de pineut als de dialog niet modal is. Maar je zegt dat de JDialog modal is :? Dan kan hij de focus toch nooit kwijtraken :? . Als dit probleem door een bug wordt veroorzaakt ben je wel flink de lul, want problemen met die modal dialogen zijn lastig te herstellen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:25

momania

iPhone 30! Bam!

Topicstarter
Op maandag 22 oktober 2001 18:01 schreef mbravenboer het volgende:
Als dit probleem door een bug wordt veroorzaakt ben je wel flink de lul, want problemen met die modal dialogen zijn lastig te herstellen.
Daar was ik al bang voor en zat ik ook al aan te denken...
We gebruiken geloof ik een van de eerste swing versies die er was en dat ie buggie is weet ik...
We hadden de applicatie ook op geheugen gebruik lopen testen en het schijnt dus dat er in die oude swing versie's een enorme memory leak zit :(
Maar angezien we niet ff rap naar een nieuwe versie kunnen ombouwen, moet het ff quick & dirty een beetje knap werken.
Volgen jaar is er pas tijd en budget om het om te bouwen :(

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Als je het gewoon met een nieuwe javac uit de nieuwste SDK hercompileert, dan moet het toch lukken. Of zie ik dat verkeerd :) ?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
momania: Daar was ik al bang voor en zat ik ook al aan te denken...
Laat anders eens wat relevante code zien als je denkt dat je zinnige stukken kunt vinden?
Maar angezien we niet ff rap naar een nieuwe versie kunnen ombouwen, moet het ff quick & dirty een beetje knap werken. Volgen jaar is er pas tijd en budget om het om te bouwen :(
Hum... zo veel werk is een ombouw naar 1.2 of 1.3 toch ook weer niet?

Je zou in het geval van enorme nood ook zelf de modaliteit af kunnen dwingen.... Ik heb dat zelf geimplementeerd voor JInternalFrames. Met een beetje goede wil, werkt dat ook voor een JDialog....

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:25

momania

iPhone 30! Bam!

Topicstarter
Hum... zo veel werk is een ombouw naar 1.2 of 1.3 toch ook weer niet?
Normaal niet nee, maar deze applicatie is opgezet in Visual Age for JAVA 3.02 en voor een heel groot gedeelte visueel geprogrammeerd (I know, ik heb het ook niet verzonnen), dus ombouwen kost dan aardig wat tijd. Ik kan dus ook geen voorbeeld code laten zien, omdat het een gigantische klerezooi is... :(
Je zou in het geval van enorme nood ook zelf de modaliteit af kunnen dwingen.... Ik heb dat zelf geimplementeerd voor JInternalFrames. Met een beetje goede wil, werkt dat ook voor een JDialog....
Heb je daar wat voorbeeld code van voor me, dan kan ik dat proberen en als het dan werkt zijn we je vanuit het project eeuwig dankbaar! :)

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Is er dan geen nieuwe versie van visual age of tenminste een update ?? Lijkt me sterk !! :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ok, ik heb niet echt een idee of dit het ook echt oplost, maar je weet het natuurlijk maar nooit :) .

Dit is de code voor een modal JInternalFrame (wat niet mogelijk is in de huidige Swing versie). De implementatie neemt in feite de event-dispatch thread over en kijkt of de events wel verwerkt mogen worden. Dit zou dus een oplossing kunnen zijn voor je probleem....

Sorry voor de lap tekst :o ;)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package org.pandoramix.gui.window;

import javax.swing.JInternalFrame;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

import java.awt.ActiveEvent;
import java.awt.AWTEvent;
import java.awt.Container;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.MouseEvent;

public class JExtendedInternalFrame extends JInternalFrame
{
    public JExtendedInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable)
    {
        super(title, resizable, closable, maximizable, iconifiable);
    }

    public JExtendedInternalFrame()
    {
        super();
    }

    public synchronized void stopModal()
    {
        notifyAll();
    }

    public synchronized void startModal()
    {
        if (isVisible() && !isShowing())
        {
            Component parent = this.getParent();
            while (parent != null)
            {
                if (parent.isVisible() == false)
                {
                    parent.setVisible(true);
                }
        
                parent = parent.getParent();
            }
        }
    
        try
        {
            if (SwingUtilities.isEventDispatchThread())
            {
                EventQueue theQueue = getToolkit().getSystemEventQueue();
        
                while (isVisible())
                {
                    AWTEvent event = theQueue.getNextEvent();
            
                    Object src = event.getSource();
                    if (event instanceof ActiveEvent)
                    {
                        ((ActiveEvent) event).dispatch();
                    }
                    else if (src instanceof Component)
                    {
                        Component src2 = (Component)src;
            
                        if(!(event instanceof MouseEvent))
                        {
                            src2.dispatchEvent(event);
                        }
                        else
                        {
                            MouseEvent mouseEvent = (MouseEvent)event;
                    
                            if( isVisible() && 
                                (mouseEvent.getID()==MouseEvent.MOUSE_PRESSED || mouseEvent.getID()==MouseEvent.MOUSE_CLICKED))
                            {
                                Component target = SwingUtilities.getDeepestComponentAt(src2, mouseEvent.getX(), mouseEvent.getY());
    
                                // It would be nice if we could go
                                // SwingUtilities.isDescendingFrom(target, this)
                                // But it dosent account for popups
    
                                if(isChild(target))
                                { 
                                    src2.dispatchEvent(event);
                                } 
                                else
                                {
                                    if(mouseEvent.getID()==MouseEvent.MOUSE_PRESSED)
                                    {
                                        // Beep
                                        getToolkit().beep();
                                    }
                                }
                            }
                            else
                            {
                                src2.dispatchEvent(event);
                            }
                        }
                    }
                }
            }
            else
            {
                while (isVisible())
                {   
                    wait();
                }
            }
        }
        catch(InterruptedException exception)
        {
            exception.printStackTrace();
        }
    }
    
    private boolean isChild(Component component)
    {
        while(component != null)
        {
            if(component == this)
            {
                return true;
            }
            else if(component instanceof JPopupMenu)
            {
                component = ((JPopupMenu)component).getInvoker();
            }
            else
            {
                component = component.getParent();
            }
        }
        return false;
    }
}

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
In principe kan je deze code gewoon vertalen naar een JDialog. Je hebt dan een JDialog, waarvan de modaliteit zelf is geimplementeerd.... Het is even de vraag of het dan wel goed werkt, maar mocht dat niet zo zijn, dan kan je misschien zelf de gebeurtenis opvangen die het probleem veroorzaakt...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:25

momania

iPhone 30! Bam!

Topicstarter
Op maandag 22 oktober 2001 18:29 schreef mbravenboer het volgende:
Ok, ik heb niet echt een idee of dit het ook echt oplost, maar je weet het natuurlijk maar nooit :) .
code:
1
 ...
Kijk! tnx, hier ga ik even wat mee doen en kijken of ik wat voor elkaar kan krijgen.
Als het gelukt is hoor je dat nog wel... :)

Neem je whisky mee, is het te weinig... *zucht*


  • momania
  • Registratie: Mei 2000
  • Laatst online: 23:25

momania

iPhone 30! Bam!

Topicstarter
We hebben het gevonden... :)

't Was een eigen gemaakt textfield, die allemaal rare dingen met de focus deed. Die trok 'm op de achtergrond weer van de popup af... |:(

iig, bedank voor de hulp !

Neem je whisky mee, is het te weinig... *zucht*

Pagina: 1