Toon posts:

JTableModel.addRow(Object[]) toont / viewed niets

Pagina: 1
Acties:

Verwijderd

Topicstarter
Geen matches
Hoi,

Effe een vraagje:
Ik heb een JTable met een DefaultTableModel.
De JTable staat op een JPanel.

Nu willen dmv een klik op de knop een regel toevoegen aan de JTable.

Het probleem is, dat zodra je de JPanel een keer bekeken heb, dat je vervolgens de nieuwe toegevoegde rows niet te zien krijgt. Je moet dan weer ff in de Table klikken om alle rows te zien.

De volgende opties hebben we geprobeert:
-Table repainten
-TableModel repainten
-Panel repainten
-scrollPane repainten
-TableModel.fireTableDataChanged
-TableModel.fireTableRowsInserted
-table.validate
-table.revalidate
-scrollPane.doLayout

Enig idee hoe het wel moet?

(En ik moet zeggen, die JTable's zijn maar ondingen!!)

iig bedankt voor de reply's

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

Alarmnummer

-= Tja =-

Geen matches
ik override de setValueAt functie van de default table model:
vb.
code:
1
2
3
4
5
public void setValueAt(Object value, int nRow, int nCol) {
    checkColumnAndRow(column,row);   
    _valueList.add(value);
    fireTableRowsUpdated(nRow, nRow);
}

Hmmzz... dit is een aangepaste versie van erg oude code, en je kan inderdaad beter werken met fireTableRowsInserted.

Verwijderd

Topicstarter
Geen matches
Das opzich een leuke oplossing, maar kan je ook in 1 keer een row (c.q. String []) in de Table proppen, zonder zelf de colom op te moeten geven?

Zoiets als wat tableModel.addRow(Object []) doet?
Op vrijdag 31 mei 2002 12:09 schreef Alarmnummer het volgende:
ik override de setValueAr functie van de default table model:
vb.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void setValueAt(Object value, int nRow, int nCol) {
        if (nRow < 0 || nRow >= m_primKeyColumnList.size())
            return;

        ColumnWrapper columnWrapper = ((ColumnWrapper) value);
        if (columnWrapper == null) {
            return;
        }

        Column column = columnWrapper.getColumn();

        RelationTableDataHelper relDataHelper = (RelationTableDataHelper) m_foreignColumnList.get(nRow);

        relDataHelper.setColumn(column);

        fireTableRowsUpdated(nRow, nRow);
    }

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

Alarmnummer

-= Tja =-

Geen matches
Hmmzz.. dat kan volgens mij erg eenvoudig, maar je bent volgens mij niet op de juiste manier hiermee bezig. Momentje.. ik plak even wat in elkaar..

Verwijderd

Topicstarter
Geen matches
Dis onze code
code:
1
2
3
4
5
6
7
public void addUpload(int uploadID, String fileName, String fileType, String fileSize)
    {
        System.out.println("d: " + uploadID + " fn: " + fileName + " ft: " + fileType + " fs: " + fileSize);
        
        String uploadData[] = { fileName, fileType, fileType, "Connecting...", Integer.toString(uploadID) };
        uploadTableModel.addRow(uploadData);
    }

We hebben ook een alternatief verzonnen en geprobeerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public void addDownload(int downloadID, String fileName, String fileType, String fileSize)
    {
        System.out.println("d: " + downloadID + " fn: " + fileName + " ft: " + fileType + " fs: " + fileSize);
        
        String downloadData[] = { fileName, fileType, fileType, "Connecting...", Integer.toString(downloadID) };
        
        DefaultTableModel dftm = (DefaultTableModel)downloadTable.getModel();
        
        dftm.addRow(downloadData);
        
        dftm.fireTableDataChanged();
        downloadTable.setModel(dftm);
        downloadTable.repaint();

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

Alarmnummer

-= Tja =-

Matched: listsupport
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
public class Persoon{
    private String voornaam;
    private String achternaam;
    private String leeftijd;
    
    public Persoon(String voornaam, String achternaam, String leeftijd){
        ...
    }
    
    ..lading getters..
}

public class PersoonList{
    private List _persoonList = new LinkedList();
    private CollectionSupport _collectionSupport = new CollectionSupport(this);
    
    
    public add(Persoon persoon){
        Anull.assertNotNull("persoon can`t be null",persoon);
        Anull.asserTrue("persoon already is in list",!_persoonList.contains(persoon));
        _persoonList.add(persoon);
        _collectionSupport.fireItemAdd(persoon);
    }
    
    public List getPersonen(){
        return Collections.unmodifiableList(_persoonList);
    }
}

public class PersoonListTableModel extends AbstractTableModel{

    private final String[] columnNames = {"Voornaam", "Achternaam", "Leeftijd"};
    
    private final static int INDEX_VOORNAAM = 0;
    private final static int INDEX_ACHTERNAAM = 1;
    private final static int INDEX_LEEFTIJD = 2;
        
    private PersoonList _persoonList;   
        
    public PersoonListTableModel(PersoonList persoonList){
        Anull.assertNotNull("persoonList can`t be null",persoonList);
        _persoonList = persoonList;
        _persoonList.add(new CollectionListenerImpl());
    }
    
    public int getRowCount() {
        return _persoonList.getPersonen().size();
    }
    
    
    public int getColumnCount() {
        return _columnNames.length;
    }
    
    
    public String getColumnName(int columnIndex) {
        checkColumnIndex(columnIndex);
        return _columnNames[columnIndex];
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        checkRowAndColumnIndex(rowIndex, columnIndex);
        
        Persoon persoon = (Persoon)_persoonList.getPersonen().get(rowIndex);
        Object result = null;
        switch(columnIndex){
            case INDEX_VOORNAAM: 
                result=persoon.getVoornaam();
                break;
            case INDEX_ACHTERNAAM: 
                result=persoon.getAchternaam();
                break;
            case INDEX_LEEFT: 
                result=Integer.toString(persoon.getLeeftijd());
                break;
            default:
                Assert.fail("not allowed columnIndex");
        }
        return result;
    }

    private class CollectionListenerImpl implements CollectionListener{
        
        public void itemAdded(CollectionEvent collectionEvent){
            fireTableDataChanged(); 
        }
        
        public void itemRemoved(CollectionEvent collectionEvent){
            fireTableDataChanged(); 
        }
        
        public void allItemsRemoved(CollectionEvent collectionEvent){
            fireTableDataChanged();
        }       
    }
}

Zoals je ziet werk ik dus met een Model (PersoonList) en events, en dat is een stuk handiger dan vanuit een tablemodel te gaan werken. Het enigste wat op dit moment nog te kort schiet in die collection support is dat je niet kan zien op welke index het verwijderd is en daarom is het een beetje lastig om te achterhalen welke row in de tablemodel aangepast moet worden. Binnenkort zet ik wel even een ListSupport in elkaar, waar dit wel mogelijk is.

Verwijderd

Topicstarter
Geen matches
Het ziet er goed uit, maar hier kan ik verder niets mee.
Ik zie alleen maar gets.
En wat ik wil is data Setten in de table.

Enig idee wat daar de slimste c.q. gemakkelijkste oplossing is?

Iig thnx 4 all the reply's

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

Alarmnummer

-= Tja =-

Geen matches
Op vrijdag 31 mei 2002 12:37 schreef Silverlinx het volgende:
Het ziet er goed uit, maar hier kan ik verder niets mee.
Ik zie alleen maar gets.
En wat ik wil is data Setten in de table.

Enig idee wat daar de slimste c.q. gemakkelijkste oplossing is?

Iig thnx 4 all the reply's
Items toevoegen doe je via de model. Dus persoonList.add(new Persoon("alarm","nummer",1)) en je Table wordt autmatisch geupdate = MVC.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Geen matches
Alarmnummer: mooi oplossing :) . Ik kan me volledig vinden in je nieuwe laag van model-gebaseerd werken die je toevoegd.

De model-gebaseerdheid van Swing is mooi, maar helaas zijn de modellen erg op de concrete GUI componenten gericht. Je zou daarom (net als jij hier doet) niet de Swing modellen als echte data-georienteerde modellen in je applicatie moeten gebruiken.

De Swing modellen dienen dan als een brug (adapter) tussen de modellen in je applicatie en de GUI componenten. Dit klinkt wellicht omslachtig, maar het werkt juist erg effectief. Veel echte modellen kan je namelijk wel beschrijven via generieke interfaces. Je ontwikkelt de brug naar het GUI component 1x met behulp van een Swing model en je kunt deze daarna hergebruiken. Je hoeft je zo veel minder druk te maken over de mapping van data naar een GUI en het onderhoud van de inhoud van de GUI.

Mooie scheiding en prettig werken dus :) .

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


Verwijderd

Topicstarter
Geen matches
Ik ben het er mee eens dat het een mooie manier van werken is en ik zal in mn komende projecten waarschijnlijk ook wel zo gaan werken.
Het probleem zit hem echter, dat mn complete layout nu eigenlijk zo goed als af is, op dit probleempje na. En ik heb een deadline van a.s. dinsdag. Met andere woorden Time is against me.
Maar goed als er geen andere mooie oplossing is, dan moet het maar.

Ik heb nog wel een Evil-programming oplossing denk ik.
Als ik de table nu weggooi en hem dan opnieuw opbouw, dan zal het waarschijnlijk ook wel werken, maar dis natuurlijk geen mooie oplossing.

Iig, bedankt voor de hulp

Verwijderd

Topicstarter
Geen matches
Waar link je in je voorbeeld code je Table met je List?

Ik zie namelijk nergens een Table aangemaakt worden.
Zou je die code er ook bij willen zetten?
Ik heb op dit moment wat kleine probleempjes met het implementeren van jouw systeem.

Bvd

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

Alarmnummer

-= Tja =-

Geen matches
Op zaterdag 01 juni 2002 17:43 schreef Silverlinx het volgende:
Waar link je in je voorbeeld code je Table met je List?

Ik zie namelijk nergens een Table aangemaakt worden.
Zou je die code er ook bij willen zetten?
Ik heb op dit moment wat kleine probleempjes met het implementeren van jouw systeem.

Bvd
JTable persoonTable = new JTable(new PersoonListTableModel(persoonList));
en zie:
[topic=513353]
voor een betere oplossing :)
Pagina: 1