Toon posts:

[JAVA SWING] Controleren of een JInternalFrame nog open is

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben met een Java Swing opdracht bezig, waar ik een simpel klantadministratie programma moet bouwen. Maar ik zit met het volgende probleem:
Ik heb een JSplitPane. In de linkerhelft zit een JTable met unieke klant id's die uit een db worden gehaald. Als ik op 1 van die klant id's klik, verschijnt er in de rechterhelft van de JSplitPane een JInternalFrame.
Het probleem: Als ik meerdere keren op eenzelfde klant id klik, krijg ik ook meerdere JInternalFrames te zien.
Terwijl het de bedoeling is, dat als er al een JInternalFrame van een klant id open staat, dat er niet nog een van diezelfde klant geopend mag worden.
Waar het om draait is dat ik wil controleren of de JInternalFrame al bestaat of niet.

Ik heb het geprobeerd met de volgende code, maar het probleem hierbij is dat de Array frames steeds groter wordt als de methode wordt aangeroepen
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
    //Create a new internal frame.
    public void createFrame(int selectedRow) {
        JInternalFrame[] frames;
        frames = desktop.getAllFrames();
        System.out.println(frames.length);
        if (frames.length > 0){
            for (int i=0; i<frames.length; i++) {
                // Get internal frame's title
                System.out.println(desktop.getAllFrames()[i].getName());
                String title = frames[i].getTitle();
                String temp = "Klant #" + (selectedRow);
                if (temp.equalsIgnoreCase(title)){ 
                    try {
                        frames[i].setSelected(true);
                        
                    } catch (java.beans.PropertyVetoException e) {}
                }
                else {
                    MyInternalFrame frame = new MyInternalFrame(selectedRow);
                    frame.setVisible(true);
                    desktop.add(frame);
                    try {
                        frame.setSelected(true);
                    } catch (java.beans.PropertyVetoException e) {}
                }
            }
        }
        else {
            MyInternalFrame frame = new MyInternalFrame(selectedRow);
            frame.setName("Frame" + selectedRow);
            frame.setVisible(true);
            desktop.add(frame);
            try {
                frame.setSelected(true);
            } catch (java.beans.PropertyVetoException e) {}
        }
    }

  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Je vergelijkt op titel van de frame. Maar ik zie je verder nergens een titel van een frame instellen? Zo kan hij zeker geen dubbele frames ontdekken.

@De Mahom:
Dan is het goed :). Geeft desktop.getAllFrames wel alle frames? Is de titelopbouw wel precies hetzelfde in die klasse als de wijze waarop je de titel in de vergelijking opbouwt (geen spatie vergeten, ander nummer dan selectedRow)?

[ Voor 47% gewijzigd door The Fox NL op 11-05-2006 15:00 ]


Verwijderd

Topicstarter
Door middel van MyInternalFrame frame = new MyInternalFrame(selectedRow); wordt er een nieuwe JInternalFrame aangemaakt met een titel en vier booleans. Deze titel wordt dus opgevraagd en vergeleken.

Dit wordt in een andere klasse gedaan.

[ Voor 11% gewijzigd door Verwijderd op 11-05-2006 14:56 ]


  • kim72
  • Registratie: Oktober 2001
  • Laatst online: 07-02 18:12
Je kan nog even kijken wat de titel van de frames is waarmee ie vergelijkt, met een System.out.println("Frame title = " + title) bijvoorbeeld tussen regel 10 en 11 in.

  • kim72
  • Registratie: Oktober 2001
  • Laatst online: 07-02 18:12
Mooier is nog om een method op MyInternalFrame te maken die de check direct doet op selectedRow, dan maakt het niet uit hoe de titel er uit ziet. (kan later handig zijn bij meertaligheid inbouwen etc.)

Verwijderd

Topicstarter
kim72 schreef op donderdag 11 mei 2006 @ 15:02:
Mooier is nog om een method op MyInternalFrame te maken die de check direct doet op selectedRow, dan maakt het niet uit hoe de titel er uit ziet. (kan later handig zijn bij meertaligheid inbouwen etc.)
En hoe zou ik dat ongeveer moeten aanpakken?

  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
MyInternalFrame is een subklasse van JInternalFrame. In jouw klasse zet je een methode getSelectedRowId oid die de SelectedRow teruggeeft. In je vergelijkingsmethode kijk je per MyInternalFrame met die methode naar de selectedRow.

Verwijderd

Topicstarter
The Fox NL schreef op donderdag 11 mei 2006 @ 15:09:
MyInternalFrame is een subklasse van JInternalFrame. In jouw klasse zet je een methode getSelectedRowId oid die de SelectedRow teruggeeft. In je vergelijkingsmethode kijk je per MyInternalFrame met die methode naar de selectedRow.
Wat bedoel je precies met SelectedRowId precies? Waarvan geeft ie die ID van terug?

  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Verwijderd schreef op donderdag 11 mei 2006 @ 15:15:
[...]


Wat bedoel je precies met SelectedRowId precies? Waarvan geeft ie die ID van terug?
Die selectedRow die je meegeeft in de constructor van MyInternalFrame

Edit:

Ik zie al waarop het fout gaat. Je vergelijkt alle frames apart. Komt de frame niet overeen dan maak je gelijk een nieuw frame aan. Dat gaat dus fout. Je moet eerst alle frames vergelijken. Als er daarin niet de selectedRow voorkomt, moet je na de for-loop alsnog een frame aanmaken.

[ Voor 103% gewijzigd door The Fox NL op 11-05-2006 15:30 ]


  • TukkerTweaker
  • Registratie: November 2001
  • Laatst online: 21-02 23:07
Of je houd met een InternalFrameListener bij welke frames openstaan / gesloten / geminimaliseerd worden / etc. Je kunt dan een geminimaliseerd frame ook maximaliseren of restoren bij een gelijke ID.

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 14:25
Je kan toch ook een ViewHandler maken die alle openstaande JInternalFrame objecten in een Map bijhoudt met klant id als sleutelwaarde. Toevoegen, controleren en verwijderen van referenties is dan allemaal O(1).
Of mis ik iets?

[ Voor 4% gewijzigd door Kwistnix op 11-05-2006 15:59 ]


  • TukkerTweaker
  • Registratie: November 2001
  • Laatst online: 21-02 23:07
FallenAngel666 schreef op donderdag 11 mei 2006 @ 15:58:
Je kan toch ook een ViewHandler maken die alle openstaande JInternalFrame objecten in een Map bijhoudt met klant id als sleutelwaarde. Toevoegen, controleren en verwijderen van referenties is dan allemaal O(1).
Of mis ik iets?
Je mist niks maar je moet daarvoor wel een listener gebruiken anders weet je natuurlijk niet wat wanneer afgeloten wordt.

  • kim72
  • Registratie: Oktober 2001
  • Laatst online: 07-02 18:12
The Fox NL schreef op donderdag 11 mei 2006 @ 15:17:
[...]
Ik zie al waarop het fout gaat. Je vergelijkt alle frames apart. Komt de frame niet overeen dan maak je gelijk een nieuw frame aan. Dat gaat dus fout. Je moet eerst alle frames vergelijken. Als er daarin niet de selectedRow voorkomt, moet je na de for-loop alsnog een frame aanmaken.
Dat ik dat niet zag... 8)7

  • kim72
  • Registratie: Oktober 2001
  • Laatst online: 07-02 18:12
Ik zou ongeveer zo'n test gebruiken:
Java:
1
2
3
4
5
6
if (frames[i] instanceof MyInternalFrame) {
  MyInternalFrame mif = (MyInternalFrame) frames[i];
  if (mif.getSelectedRow() == selectedRow) {
    ...  // doe je ding hier
  }
}

Kom je zo verder?

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 16-01 14:17
ik denk dat ie wat anders bedoelt...

als je nou in de JInternalFrame eens een static methode maakt getInstance() en een static variabele die er zo uitziet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public XXFrame extends JInternalFrame {

  private static XXFrame instance;

  public XXFrame(...) {
    ..
    ..
  }

public JInternalFrame getInstance() {
  if( null == instance ) {
    instance = new XXFrame(...);
  }

  return instance;
}


nu krijg je altijd maar 1 scherm, of je nou 1 of 100x op het id klikt


// edit
en je hoeft nu ook niet meer een controle uit te voeren of het scherm al geopent is of niet, want dat doet hij zelf..

[ Voor 12% gewijzigd door martennis op 11-05-2006 20:25 ]


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
martennis schreef op donderdag 11 mei 2006 @ 20:22:
ik denk dat ie wat anders bedoelt...

als je nou in de JInternalFrame eens een static methode maakt getInstance() en een static variabele die er zo uitziet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public XXFrame extends JInternalFrame {

  private static XXFrame instance;

  public XXFrame(...) {
    ..
    ..
  }

public JInternalFrame getInstance() {
  if( null == instance ) {
    instance = new XXFrame(...);
  }

  return instance;
}


nu krijg je altijd maar 1 scherm, of je nou 1 of 100x op het id klikt


// edit
en je hoeft nu ook niet meer een controle uit te voeren of het scherm al geopent is of niet, want dat doet hij zelf..
Nah, dat bedoelt ie niet, hij wil niet 1 instantie van een InternalFrame, maar slechts 1 geopend venster per klant.
kim72 schreef op donderdag 11 mei 2006 @ 20:08:
[...]


Dat ik dat niet zag... 8)7
Hehe, ik zag hem eerst ook niet.
kim72 schreef op donderdag 11 mei 2006 @ 20:13:
Ik zou ongeveer zo'n test gebruiken:
Java:
1
2
3
4
5
6
if (frames[i] instanceof MyInternalFrame) {
  MyInternalFrame mif = (MyInternalFrame) frames[i];
  if (mif.getSelectedRow() == selectedRow) {
    ...  // doe je ding hier
  }
}

Kom je zo verder?
Juist, zoiets moet De Mahom doen. En in "//doe je ding hier" zou hij iets van een boolean op true moeten zetten als er een internal frame is gevonden. Na de for-loop de boolean checken, is ie false, dan is er geen InternalFrame voor die klant en kan je hem maken.
Pagina: 1