[java]gegevens denk probleem

Pagina: 1
Acties:

  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
Hoi,

Ik ben bezig met een programmaatje voor het schaatsen en nu wil ik dmv een invoerscherm gegevens kunnen invoeren van de tijden die zijn gereden en naam van schaatser, dit gaat wel lukken maar ik wil dit doen in combinatie met een JList zodat ik de namen overzichtelijk netjes kan laten verschijnen op het scherm.

Maar nu zit ik met het volgende probleem :

Ik heb gelezen in de api dat je ook objecten in een JList kan plaatsen? ja toch?
Ik heb een object schaatser gemaakt waar alle gegevens inkomen te staan, hoe kan ik er nu voor zorgen dat alleen de naam uit het object schaatser verschijnt in de JList op het scherm? En dat als ik op een naam klik in de JList dat dan de gegevens van de desbetreffende schaatser in de invoervelden verschijnt voor het nakijken van de resultaten ed.

Kan iemand mij een stootje in de goeie richting geven hoe ik dit soort dingen moet oplossen, ik heb namelijk niet echt een idee en in de java tutorial staat ook niet een voorbeeld met objecten in een JList alleen met het listModel.

Hier nog een schetsje van het programma tot nu toe :
Afbeeldingslocatie: http://stormvogels.veendam.org/schaatser.gif

  • traviandus
  • Registratie: Februari 2001
  • Laatst online: 25-03-2025

traviandus

vague

Je hoeft alleen de functie toString() (die elk java.lang.Object heeft) te overloaden:

public void toString() {
return naam;
}

Verder moet je een SelectionListerer implementeren. Als een waarde verandert wordt valueChanged() aangeroepen waarin je dan je velden update.

Verwijderd

setListData
public void setListData(Object[] listData)Constructs a ListModel from an array of objects and then applies setModel to it.

Parameters:
listData - an array of Objects containing the items to display in the list
See Also:
setModel(javax.swing.ListModel)
http://java.sun.com/j2se/1.4/docs/api/index.html

voortaan ff in de API kijken :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Zowel toString als setListData gebruiken is naar mijn mening geen mooie oplossing. Het sluit namelijk niet goed op Swing aan.

Als je het echt goed wilt doen moet je een eigen ListModel maken. Je kan dit makkelijk doen door AbstractListModel te extenden. Dit werkt echt erg makkelijk.

Je hebt dan een mooi model, waarin dus echt schaatsers zitten. Je kan nu op twee manieren de data weergeven in de list: even toString in Schaatser implementeren: In dat geval wordt de default renderer gebruikt. Ook kan je zelf een renderer schrijven. Helaas wordt dat echter niet erg makkelijk gemaakt in Swing. Ik heb daar wat handige klassen voor liggen, waarmee het triviaal wordt. Je hoeft dan alleen nog maar een TextProvider te implementeren, die een String representatie van een Object maakt. toString vind ik zelf niet buitengewoon fraai omdat je vaak een andere string wilt zien.

Nu is je probleem echter nog niet echt opgelost ;) .Om de huidige selectie te verwerken moet je gebruik maken van het ListSelectionModel. Dit model bevat de huidige selectie in de list. Je kan een ListSelectionListener aanmelden op dit model. Naar aanleiding van een aanpassing in de selectie (die je binnen krijgt via de ListSelectionListener) kan je de content van de schaatser laten zien.

Als je het _echt_ heel mooi wilt doen moet je eigenlijk geen kennis opnemen van de list in je component met de tekstvelden. Je kan dan een eigen model maken (SchaatserSelectionModel bijvoorbeeld). Je kan de geselecteerde schaatser dan instellen uit de list. Het component luistert slechts naar het model en heeft dus geen kennis van de aanwezigheid van een list....

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je trouwens meer wilt weten of mijn laatste voorstel, kan ik het wel iets uitgebreider uitleggen. Als je echter nog nooit met modellen hebt gewerkt kan je misschien beter eerst gewoon even doen wat ik eerst zei: ListModel en ListSelectionModel gebruiken.

Leuk trouwens, Java-fan en schaats-fan (neem ik aan?) :)

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hier nog een deep-link in de Java Tutorial, waarin perfect wordt uitgelegd hoe je met die modellen moet werken:

http://java.sun.com/docs/books/tutorial/uiswing/components/list.html

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik kon het niet laten om er nog even iets over te zeggen ;) .
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface ValueSelectionModel
{
    public void addChangeListener(ChangeListener listener);
    public void removeChangeListener(ChangeListener listener);
}

public interface SchaatserSelectionModel extends ValueSelectionModel
{
    public Schaatser getSelection();
}

public interface MutableSchaatserSelectionModel extends SchaatserSelectionModel
{
    public void setSelection(Schaatser schaatser);
}


public class DefaultSchaatserSelectionModel implements MutableSchaatserSelectionModel
{
    private Schaatser _selection;

    //simpele default implementatie
}

0. Implementeer een SchaatsersModel die extends van AbstractListModel en bijvoorbeeld een List van schaatsers heeft. Gebruik de methode toString of een speciale renderer

1. Implementeer een ListSelectionListener die de geselecteerde waarde verwerkt in een MutableSchaatserSelectionModel.

2. Meldt deze ListSelectListener aan op de List van schaatsers.

3. Maak het component met de tekstvelden zo dat de content is gebaseerd op een SchaatserSelectionModel. Meld daarvoor een ChangeListener aan op het model. Als de waardere veranderd, verander je de content van de tekstvelden.

Ik gebruik deze opzet zelf altijd (maar dan met geparameterizeerde typen, waardoor het nog veel mooier is).

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Een iets andere opzet die je ook heel makkelijk kan gebruiken is om het tekstvelden component te laten werken op een SchaatserModel. Het wordt dan in feite een soort atomair component zoals in Swing. Je kan dan twee dingen doen: of een ander model zetten als de selectie wordt aangepast of de inhoud van het model wijzigen.

Het voordeel van deze iets uitgebreidere aanpak is dat het SchaatserComponent geeneens kennis hoeft te hebben van het feit dat er schaatsers geselecteerd worden. Het geeft gewoon een schaartser weer, meer niet. Lekker herbruikbaar dus :) .

Maar ik zal nu ophouden ;) .

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
doink wat een brok info :)
Een iets andere opzet die je ook heel makkelijk kan gebruiken is om het tekstvelden component te laten werken op een SchaatserModel. Het wordt dan in feite een soort atomair component zoals in Swing. Je kan dan twee dingen doen: of een ander model zetten als de selectie wordt aangepast of de inhoud van het model wijzigen.
Zal dit dan de makkelijste oplossing zijn? Ik ben namelijk niet zo'n expert nog in java :) ben er wel steeds mee bezig en het gaat ook steeds beter.

Of zal ik het op je eerdere voorstel doen :
Als je het echt goed wilt doen moet je een eigen ListModel maken. Je kan dit makkelijk doen door AbstractListModel te extenden. Dit werkt echt erg makkelijk.
Ik moet nog even kijken hoe dat zit met AbstractListModel dan geeft ie aan dat ik verschillende methodes nog moet definieren zoals getSize en nog een paar, klopt dat?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Die SchaatserSelection- en SchaatserModel werken wel erg goed, maar als je nog nooit echt met modellen hebt gewerkt is het misschien een beetje een ongewone oplossing.

Het klopt inderdaad dat je nog een paar methoden moet implementeren voor het AbstractListModel, daarom isie ook abstract ;) .

De oplossing die het dichts bij de standaard Swing oplossing ligt (maar niet echt herbruikbaar) :

1. SchaatserListModel extends AbstractListModel. Dit model hangt onder de list.
2. ListSelectionListener aanmelden op de list en deze direct de content van de velden laten aanpassen.

Een mogelijke uitbreiding, die het geheel mooier, zelfstandiger en herbruikbaarder maakt is het invoeren van het SchaatserSelectionModel of een SchaatserModel (SelectionModel is het makkelijkst). Dit model hangt dan onder het component met de tekstvelden.

Anders maak je eerst de basis oplossing en kijk je daarna of je de uitbreiding nog wil toevoegen?

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
Oke ik ga voor de basisoplossing ;)

nu ben ik al druk aan het zoeken geweest en heb nu de werking van de ListSelectionListener gevonden in de tutorial, maar hoe moet ik nu die SchaatserListModel implementeren moet ik daar alle objecten van Schaatser die ik aanmaak via het invoerveld inzetten en dan de SchaatserListModel aan de JList hangen?

En hoe moet ik de methods (getElementAt en getSize) die behorden tot de AbstractListModel implementeren, kan ik gewoon die methods erin zetten en ze dan later gebruiken of zie ik dat verkeerd?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: maar hoe moet ik nu die SchaatserListModel implementeren moet ik daar alle objecten van Schaatser die ik aanmaak via het invoerveld inzetten en dan de SchaatserListModel aan de JList hangen?
Een JList moet je aanmaken met een ListModel. Als je die dus eenmaal hebt is het simpel ;) .

Je SchaatserListModel extend je van het AbstractListModel. Het is het makkelijkst om dat model met een List (ArrayList, liever geen Vector) van schaatsers te laten werken. De paar methoden die je nog moet implementeren doen iets met die lijst:
En hoe moet ik de methods (getElementAt en getSize) die behorden tot de AbstractListModel implementeren
getElementAt wordt dus gewoon schaatsers.get(i). getSize() wordt gewoon schaatsers.size();
kan ik gewoon die methods erin zetten en ze dan later gebruiken of zie ik dat verkeerd?
Je hoeft ze eigenlijk geeneens zelf te gebruiken, de JList gebruik die automatisch :) .

Ik heb even een voorbeeldje opgezocht. Dit is wel met een JTable, maar dat maakt niet zoveel uit. Dit is een implementatie die een array als interne opslag heeft. Het lijkt een beetje op jouw probleem. Je hebt bij jou alleen geen kolommen, dus dat maakt het nog veel makkelijker :) .
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
package org.pandoramix.exception.gui;

import javax.swing.table.*;

public class StackTraceTableModel extends AbstractTableModel
{
    private StackTraceElement[] _stacktrace;

    public static final int CLASS_NAME_COLUMN   = 0;
    public static final int METHOD_NAME_COLUMN  = 1;
    public static final int SOURCE_FILE_COLUMN  = 2;
    public static final int LINE_NUMBER_COLUMN  = 3;

    public StackTraceTableModel(StackTraceElement[] stacktrace)
    {
        super();
        _stacktrace = stacktrace;
    }

    public int getRowCount()
    {
        return _stacktrace.length;
    }

    public void setStackTrace(StackTraceElement[] stacktrace)
    {
        _stacktrace = stacktrace;
        fireTableDataChanged();
    }

    public StackTraceElement[] getStackTrace()
    {
        return _stacktrace;
    }

    public int getColumnCount()
    {
        return 0; //should not be used by the Swing implementation
    }

    public Object getValueAt(int row, int column)
    {
        String result;
        StackTraceElement element = _stacktrace[row];

        switch(column)
        {
            case CLASS_NAME_COLUMN:     result = element.getClassName();                     break;
            case METHOD_NAME_COLUMN:    result = element.getMethodName();                    break;
            case SOURCE_FILE_COLUMN:    result = element.getFileName();                  break;
            case LINE_NUMBER_COLUMN:    result = String.valueOf(element.getLineNumber());    break;
            default:                    result = "undefined";
        }

        return result;
    }

    public TableColumnModel createDefaultTableColumnModel()
    {
        TableColumn column;
        DefaultTableColumnModel result = new DefaultTableColumnModel();

        column = new TableColumn(CLASS_NAME_COLUMN, 250);
        column.setHeaderValue("Class");
        result.addColumn(column);

        column = new TableColumn(METHOD_NAME_COLUMN, 100);
        column.setHeaderValue("Method");
        result.addColumn(column);

        column = new TableColumn(SOURCE_FILE_COLUMN, 200);
        column.setHeaderValue("Sourcefile");
        result.addColumn(column);

        column = new TableColumn(LINE_NUMBER_COLUMN, 50);
        column.setHeaderValue("Line");
        result.addColumn(column);

        return result;
    }
}

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
ik heb wat werkende ... ik weet niet of dit klopt :)

Dit is nu de SchaatserList :
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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SchaatserList extends JPanel
{
  JList list;
  SchaatserListModel listModel;
  Schaatser schaatser;

  public SchaatserList()
  {
    jbInit();
  }

  void jbInit()
  {
    setLayout(new BorderLayout());

    listModel = new SchaatserListModel();
    list = new JList(listModel);

    // add component to panel
    add(list,BorderLayout.CENTER);
  }
}

En dit de SchaatserListModel :
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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class SchaatserListModel extends AbstractListModel
{
  ArrayList schaatsers;

  public SchaatserListModel()
  {
    schaatsers = new ArrayList();
    schaatsers.add("blaat");
    schaatsers.add("test");
  }

  public int getSize()
  {
    return schaatsers.size();
  }

  public Object getElementAt(int index)
  {
    return schaatsers.get(index);
  }

}

Ik weet niet of ik de methodes die behoren bij abstractlistmodel nu goed heb geimplementeerd??

Maar het testje werkt nu wel :)

Ga nu even kijken of ik de objecten van de schaatsers ook kan vullen dmv invoeren via de textfields..

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ziet er goed uit toch :) ?

Je moet nu in je model een methode add(Schaatser schaatser) maken om een schaatser toe te voegen. Je voegt hem dan gewoon aan je lijst toe en je moet de listeners (de JList dus) waarschuwen dat er iets nieuws is.

De methode add ziet er dan ongeveer zo uit:
code:
1
2
3
schaatsers.add(schaartser)
int newPosition = schaatsers.size() - 1;
fireIntervalAdded(this, newPosition, newPosition);

De remove kan je zelf wel verzinnen ;) .

Edit: oeps, klein foutje ;) .

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je moet trouwens natuurlijk geen strings aan de schaatsers lijst toevoegen, maar Schaatser objecten... Als je nog geen Schaatser klasse hebt, moet je die ff maken...

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
ja ik wist dat ik de objecten van schaatser aan de list moet toevoegen :) was alweer aan het klooien en wou nog niet echt lukken.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class SchaatserListModel extends AbstractListModel
{
  ArrayList schaatsers;
  Schaatser schaatser;
  Object schaatser2;

  public SchaatserListModel()
  {
    schaatsers = new ArrayList();

    schaatser2 = new Schaatser("Test");
    schaatsers.add(schaatser2);

  }



dit lukt wel maar ik moet jouw manier nog ff uitproberen om hem dan tussen de list te zetten

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: dit lukt wel maar ik moet jouw manier nog ff uitproberen om hem dan tussen de list te zetten
Dat is alleen nodig als je later een Schaatser aan je model toevoegd he? Je kan de initiele schaatser er gewoon indumpen op de manier die je nu gebruikt.

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
en ik neem aan dat dit
code:
1
2
  Schaatser schaatser;
  Object schaatser2;

weer weg gaat? ;) .

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
ja dat heb ik weer weggehaald ....was meer om het testen.

ik heb nu nog een klein probleempje.. ik kan geen ListSelectionListener toevoegen aan de SchaatserListModel?

Tenminste hij geeft niet de mogelijkheid in jbuilder om het te selecteren?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Een ListSelectionListener zit op een ListSelectionModel. Dat is weer een ander model dat het ListModel (waarin je alleen de data specificeert). Je kan twee dingen doen:

1. ListSelectionModel vragen aan JList en dan aanmelden.
2. Zelf ListSelectionModel aanmaken en daarmee de JList aanmaken.

In principe is de 2e aanpak misschien de mooiste oplossing.

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
ow sorry.....ik bedoelde het verkeerd... het onder de runtime toevoegen van objecten aan de ListModel wil nog niet lukken of het ligt aan het feit dat de JList niet wordt geupdated?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je ze niet ziet verschijnen in de JList geef je het event niet goed door... Heb je die fire wel gebruikt? Gebruik je de goede index?

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


  • tomato
  • Registratie: November 1999
  • Niet online
Op donderdag 01 november 2001 14:38 schreef mbravenboer het volgende:
edit != quote
Hehe :D
Maar je hebt nog je tikfout niet verbeterd ;)

s/ moet//;

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
tomato: Maar je hebt nog je tikfout niet verbeterd ;)
Hum, thanx :) . Ik verbeterde een andere fout (even -> event) ;) .

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
ik heb nu dit...
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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class SchaatserListModel extends AbstractListModel
{
  ArrayList schaatsers;

  public SchaatserListModel()
  {
    schaatsers = new ArrayList();
  }

  public int getSize()
  {
    return schaatsers.size();
  }

  public Object getElementAt(int index)
  {
    return schaatsers.get(index);
  }

  public void add(Schaatser schaatser)
  {
    schaatsers.add(schaatser);
    int newPosition = schaatsers.size() - 1;
    fireIntervalAdded(this, newPosition, newPosition);
  }


}


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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SchaatserList extends JPanel
{
  JList list;
  SchaatserListModel listModel;


  public SchaatserList()
  {
    jbInit();
  }

  void jbInit()
  {
    setLayout(new BorderLayout());

    listModel = new SchaatserListModel();
    

    list = new JList(listModel);


    // add component to panel
    add(list,BorderLayout.CENTER);
  }

}

En als ik de methode add nu aanroep vanuit de class met het invoergedeelte :
code:
1
2
3
4
5
    if ( e.getSource() == btToevoegen )
    {
        String naam = tfNaam.getText();
        lijst.add(new Schaatser(naam));
    }

Dit zou toch moeten werken?
Maar op de een of andere manier doe ik iets fout.. ik denk dat het aan die methode add ligt.

Moet ik deze methode veranderen?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum, ik zie inderdaad geen probleem :?

Gebruik je bij het toevoegen van de Schaatser wel het model wat ook onder de JList zit?
Werkt de knop wel echt?
Wordt er wel uberhaupt iets zichtbaar in de lijst?

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
Gebruik je bij het toevoegen van de Schaatser wel het model wat ook onder de JList zit?
Hmm... hoe bedoel je dit? ik voeg de schaatser toch toe via de SchaatserListModel en voeg dit dan weer toe aan de JList dmv de constructor.

De knop werkt wel ....want als ik het object schaatser wat ik meestuur, print op het scherm dmv System.out.print.ln dan doet ie het wel goed.

De JList blijft nu dus nog geheel leeg. erg vaag.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Vaag, ik kan zo helaas geen fout zien. Kan je je code online zetten zodat ik het door kan kijken?

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: Hmm... hoe bedoel je dit? ik voeg de schaatser toch toe via de SchaatserListModel en voeg dit dan weer toe aan de JList dmv de constructor.
Ik zie daar in je Panel dat je een nieuw SchaatserListModel maakt. Gebruik je dit model ook wel om je items toe te voegen? Dus: zorg je wel voor dat je overal dezelfde SchaatserListModel instantie gebruikt?

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
nou ik heb de code online gezet, als je zin hebt mag je even kijken... als je er niet uitkomt maakt niet uit hor.. dan zoek ik nog wel ff verder je moet er ook niet zoveel tijd voor mij aan spenderen vind ik

http://stormvogels.veendam.org/java/

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Het is inderdaad het probleem wat ik al vermoedde.... Je gebruikt twee verschillende instanties van het model! Je moet het model maar 1 keer aanmaken en die instantie meegeven aan de JList (in SchaatserList) en InvoerPanel. Je maakt in allebei deze klassen een new SchaatserListModel aan en dat is natuurlijk niet goed. Allebei de klassen moeten wel met dezelfde instantie werken.

Het makkelijkst is het om het model even op 1 centrale plaats aan te maken en dan mee te geven aan de constructor van de beide klassen.

Duidelijk waar het probleem zit?

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
ow..... dat wist ik nog niet dat dat niet mocht? ik zal het ff proberen en kijken of het werkt

  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
zo ik heb nog even verder gekeken en weet nu wel zeker dat de knop werkt en dat hij de arrayList ook vult met de schaatser objecten.

maar nu is het probleem nog steeds dat de JList niet wordt geupdated?
code:
1
fireIntervalAdded(this, newPosition, newPosition);

heb ik dit stukje misschien verkeerd? ik wil het nog niet opgeven.... :)

ik heb werkelijk alles nu zo'n beetje al geprobeerd en er zal wel een klein foutje inzitten ergens maar waar..

ik denk dan toch dat het in die methode fireIntervalAdded zit ofzo?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: zo ik heb nog even verder gekeken en weet nu wel zeker dat de knop werkt en dat hij de arrayList ook vult met de schaatser objecten.
En ik neem aan dat je JList en de knop nu ook met dezelfde instantie van het model werken?
maar nu is het probleem nog steeds dat de JList niet wordt geupdated?
Als ze met dezelfde instantie werken zou dit wel moet gebeuren. De fireIntervalAdded methode-aanroep is volgens mij correct. Kan je je online code over updaten? Dan zal ik wel ff kijken.

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
Op vrijdag 02 november 2001 16:29 schreef mbravenboer het volgende:

En ik neem aan dat je JList en de knop nu ook met dezelfde instantie van het model werken?
Ja ik heb dat nu veranderd maar zonder resultaat.. moet ik misschien de lijst repainten, ik zag zoiets staan in de nieuwsgroepen.

http://stormvogels.veendam.org/java/

ik heb het nog maar een x online gezet, van wat ik nu heb

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum ik zie zo idd geen fout. Ik zal het even downloaden om te kijken of ik het daarmee kan achterhalen.

Overigens is het niet zo mooi dat je de schaarser via het GUI component toevoegd, maar dat maakt niet zoveel uit.

Later meer :) .

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Uhm..... volgens mij heb je nu het probleem nogal verlegd als ik het goed zie: Je gebruikt nu twee SchaatserLists!

Ik zal even een voorbeeld maken zodat je ziet wat er gebeurt.

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je de code van SchaatserList aanpast naar dit, waardoor er een simpele id wordt toegewezen aan elke list, zul je zien dat je twee lijsten hebt en de schaatser maar aan 1 van die lijsten wordt toegevoegd:
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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SchaatserList extends JPanel
{
  JList list;

  SchaatserListModel listModel;

  private static int counter;
  static
  {
     counter = 0;
  }
  private int id;

  public SchaatserList()
  {
    jbInit();
    id = counter++;
    System.out.println("Created SchaatserList: " + id); 
  }

  void jbInit()
  {
    setLayout(new BorderLayout());

    listModel = new SchaatserListModel();
    list = new JList(listModel);

    // add component to panel
    add(BorderLayout.CENTER, new JScrollPane(list));
  }

  public void add(Schaatser schaatser)
  {
    System.out.println("Adding schaatser to list: " + id);
    listModel.add(schaatser);
  }

}

Ik zal je matsen en ff de oplossing posten.

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
is dat zo gebruik ik nu 2 x een schaatserList? hmzzz :)

maar ik heb ook nog ff een werkend voorbeeldje gemaakt :
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
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class Frame1 extends JFrame implements ActionListener {

  private JPanel panel;
  private JButton button;
  private SchaatserListModel listModel;
  private JList list;
  private ArrayList data;

  public Frame1()
  {
    panel = new JPanel();

    button = new JButton("klik");
    button.addActionListener(this);

    data = new ArrayList();


    listModel = new SchaatserListModel(data);
    list = new JList(listModel);

    panel.add(button);
    panel.add(list);


    Container contentPane = getContentPane();
    contentPane.add(panel);
  }

  public void actionPerformed(ActionEvent e)
  {
    if( e.getSource() == button )
      listModel.addData("test");
  }

  public static void main(String args[])
  {
    Frame1 frame = new Frame1();
    frame.setSize(new Dimension(200,200));
    frame.show();
  }
}


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
import javax.swing.*;
import java.awt.*;
import java.util.*;

public class SchaatserListModel extends AbstractListModel{

    private ArrayList myData;

    public SchaatserListModel (ArrayList data)
    {
      myData=data;
    }
    public int  getSize()
    {
      return myData.size();
    }
    public Object getElementAt(int i)
    {
      return myData.get(i);
    }

    public void addData(String string)
    {
      myData.add(string);    
      fireContentsChanged(this,0,myData.size()-1);    
    }
}

alleen verloopt dit voorbeeld niet over meerdere wegen...dit werkt dus wel.... maar nu weet ik nog steeds niet waarom die andere het niet doet.... best vaag

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Het werkt nu hier ;) .

Ik heb het volgende gedaan:

Tijdelijke main in InvoerPanel. Daar maak ik 1 model aan. Deze geef ik mee aan de constructoren van InvoerPanel en SchaatserList. Ze hebben nu dus allebei hetzelfde model.

Als je hem runt met java InvoerPanel zul je zien dat het goed werkt.

Code list:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SchaatserList extends JPanel
{
  SchaatserListModel model;

  public SchaatserList(SchaatserListModel model)
  {
    this.model = model;
    jbInit();
  }

  void jbInit()
  {
    setLayout(new BorderLayout());
    JList list = new JList(model);
    // add component to panel
    add(BorderLayout.CENTER, new JScrollPane(list));
  }
}

Code InvoerPanel:
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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class InvoerPanel extends JPanel implements ActionListener
{
  // Declareer componenten
  private JPanel panel, buttonPanel;
  private JTextField tfNaam, tf500M, tf1500M, tf5000M, tf10000M;
  private JLabel lbNaam, lb500M, lb1500M, lb5000M, lb10000M, empty;
  private JButton btToevoegen, btVerwijderen;
  SchaatserListModel model;

  public InvoerPanel(SchaatserListModel model)
  {
    this.model = model;
    jbInit();
  }

  public static void main(String[] ps)
  {
     SchaatserListModel model = new SchaatserListModel();

     JFrame frame = new JFrame();
     frame.getContentPane().setLayout(new BorderLayout());
     frame.getContentPane().add(BorderLayout.WEST, new SchaatserList( model ));
     frame.getContentPane().add(BorderLayout.CENTER , new InvoerPanel( model ));
     frame.pack();
     frame.show();
  }

  void jbInit()
  {
    panel = new JPanel(new GridLayout(0,2,0,5));
    buttonPanel = new JPanel();

    // Set up the layout
    setLayout(new BorderLayout());


    // Set up the label
    lbNaam = new JLabel("Naam :");
    lb500M = new JLabel("500 meter tijd :");
    lb1500M = new JLabel("1500 meter tijd :");
    lb5000M = new JLabel("5000 meter tijd :");
    lb10000M = new JLabel("10000 meter tijd :");

    // Set up the textfield
    tfNaam = new JTextField("",40);
    tf500M = new JTextField("",40);
    tf1500M = new JTextField("",40);
    tf5000M = new JTextField("",40);
    tf10000M = new JTextField("",40);

    //Set up the button
    btToevoegen = new JButton("Toevoegen");
    btVerwijderen = new JButton("Verwijderen");


    //add actionlisteners to component
    btToevoegen.addActionListener(this);

    //add component to panels
    panel.add(lbNaam);
    panel.add(tfNaam);
    panel.add(lb500M);
    panel.add(tf500M);
    panel.add(lb1500M);
    panel.add(tf1500M);
    panel.add(lb5000M);
    panel.add(tf5000M);
    panel.add(lb10000M);
    panel.add(tf10000M);

    buttonPanel.add(btVerwijderen);
    buttonPanel.add(btToevoegen);

    add(buttonPanel,BorderLayout.AFTER_LINE_ENDS);
    add(panel,BorderLayout.NORTH);
  }

  public void actionPerformed(ActionEvent e)
  {
    if ( e.getSource() == btToevoegen )
    {
        String naam = tfNaam.getText();
        model.add(new Schaatser(naam));
    }
  }

}

Begrijp je nu ongeveer de bedoeling, waarom het eerst niet werkte, nu wel en waarom deze oplossing mooi is?

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: dit werkt dus wel.... maar nu weet ik nog steeds niet waarom die andere het niet doet.... best vaag
Eigenlijk heel simpel: als je nu op de knop drukt wordt de schaatser toegevoegd aan het model wat onder de lijst hangt. Er is dus maar 1 model! Zet maar eens in de constructor van je model een System.out. Je zult zien dat in je eerste, niet werkende oplossing er tweee keer iets wordt geprint en hier maar 1 keer. Je voegde de schaatser dus aan een lijst toe die helemaal niet zichtbaar was :) .

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
zo bedankt!

owja.... als ik nu de invoerpanel en de schaatserlist moet aanmaken in de splitpane .....dan hoef ik niets anders te doen dan het schaatserlistmodel (model) ook aanmaken in splitpane en dan bij het aanmaken van de schaatserlist en invoerpanel de instantie van schaatserlistmodel doorgeven dmv de constructor?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: zo bedankt!
Graag gedaan ;) .
owja.... als ik nu de invoerpanel en de schaatserlist moet aanmaken in de splitpane .....dan hoef ik niets anders te doen dan het schaatserlistmodel (model) ook aanmaken in splitpane en dan bij het aanmaken van de schaatserlist en invoerpanel de instantie van schaatserlistmodel doorgeven dmv de constructor?
Helemaal juist ;) .

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


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
zo nu werkt ie echt!!

echt heel erg bedankt nogmaals!
heb er veel van geleerd!
ach 'k moet gewoon veel met java bezig zijn dan krijg ik het vanzelf beter onder de knie.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: zo nu werkt ie echt!!
Mooi :) .
echt heel erg bedankt nogmaals!
Das nog eens een tevreden klant ;) .
heb er veel van geleerd!
Dat denk ik ook ja. Het laatste stukje wat je schreef was behoorlijk correct :) . Ik hoop dat je nu goed begrepen hebt hoe modellen werken en hoe je hiermee (o.a) op een makkelijke manier userinterface compontenten (en zelfs verwerking van user events) onafhankelijk kunt maken van elkaar :) .

Voortaan altijd gebruiken he ;) . Onder elk Swing component kan een model zitten.

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

Pagina: 1