Toon posts:

[Java] JTable met dynamisch aantal rijen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met het maken van een JTable met een dynamisch aantal rijen, vanwege het feit dat het aantal rijen wel een maximum heeft heb ik wel besloten tot een implementatie met een 2-d array

In code de belangrijkste delen

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
public class GUI extends Applet implements ActionListener
{
   private JTable tableStatus;  
   private MyTableModel tableModelStatus;

   public void init() 
   {
      tableStatus = new JTable();
      tableModelStatus = new MyTableModel();
      
      tableStatus.setModel(tableModelStatus);
      add(tableStatus);
   }

   public void setStatus() 
   { 
      Object[][] data = {{"1","2","3"},{"2","3","4"}};
      tableModelStatus.setData(data);
      tableStatus.setModel(tableModelStatus);
      tableStatus.repaint();
   }
}

class MyTableModel extends AbstractTableModel {
   final String[] columnNames = {"Name","Type","Value"};
   Object[][] data = {{"-","-","-"},{"-","-","-"},{"-","-","-"}};
   int rows = 1;
    
   public int getColumnCount() {
      return columnNames.length;
   }
    
   public int getRowCount() {
      return rows;
   }

   public String getColumnName(int col) {
        return columnNames[col];
   }

   public Object getValueAt(int row, int col) {
      return data[row][col];    
   }

   public Class getColumnClass(int c) {
      return getValueAt(0, c).getClass();
   }
    
   public void setData(Object[][] _data) {
       rows = _data.length;
       data = _data;
   }
}


Het probleem dat ik heb is dat indien ik het scherm wil vernieuwen met de functie setStatus() stel ik de variabele rows op 2, de 1e rij bevat de juiste informatie, een 2e rij wordt echter niet gemaakt, de functie getRowCount wordt echter wel een aantal malen aangesproken.

Hoe kan ik er dus voor zorgen dat het aantal rijen dynamisch kan wijzigen?

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

Alarmnummer

-= Tja =-

Je moet op een hele andere manier te werk gaan. Je moet eerst een object(en) ontwerpen waarin alle informatie staat (in jouw geval intern iets met een lijst ofzo) en hierin mag geen gui code voorkomen. Een van de dingen die door de meeste mensen verkeerd word begrepen is dat je de model objecten van Swing niet mag gebruiken om normale informatie in op te slaan. Het is een hulpmiddel om van domein objecten naar de gui te komen.

Om even op jouw voorbeeld terug te komen.
Persoonlijk zou ik dus een domein object maken, en daar even een list collection support aan toevoegen (zoek maar even naar een topic van mij, daar kan je het wel downen). Dan ga je die tablemodel als luisteraar toevoegen aan die listModel en kan je dmv event elementen toevoegen/verwijderen aan die tablemodel. (Dus indirect weer aan de JTable)

[ps]
je moet die JTable ook nog even in een scrollPane plaatsen. En verder ben jij AWT code met Swing code aan het combineren en die vinden elkaar niet zo lief.

Verwijderd

Topicstarter
Alarmnummer schreef op 06 november 2002 @ 11:23:
Je moet op een hele andere manier te werk gaan. Je moet eerst een object(en) ontwerpen waarin alle informatie staat (in jouw geval intern iets met een lijst ofzo) en hierin mag geen gui code voorkomen. Een van de dingen die door de meeste mensen verkeerd word begrepen is dat je de model objecten van Swing niet mag gebruiken om normale informatie in op te slaan. Het is een hulpmiddel om van domein objecten naar de gui te komen.
Ik heb dat ook in een aparte class opgeslagen, maar om te testen of m'n principe werkt heb ik deze in de gui code opgeslagen, later wordt de data uit de andere class gebruikt O-)

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

Alarmnummer

-= Tja =-

[rml]JTableModel.addRow(Object[ ]) toont / viewed niets[/rml]
[rml][ Java] ListSupport voor de liefhebbers. *[/rml]

Ik heb er al tijden niets meer aan gedaan, de classes moeten nog geparametriseerd worden. en de ListListener interface is nog niet krachtig genoeg. Verder ben ik bezig met een project in Nice met een veel krachtigere versie hiervan, maar die source is nog niet openbaar (moet de ontwerper van Nice er eerst maar voor zorgen dat hij zijn geparametriseerde polymorphisme goed voor elkaar heeft)

Verwijderd

Topicstarter
Ik ben bezig met je advies in de eerste link die je gaf, ik snap alleen niet wat je met deze class CollectionSupport bedoeld en wat deze inhoudt.

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

Alarmnummer

-= Tja =-

Dat is een 'support' class. Als jij een lijst hebt mbv Personen, dan is het handig als je events kan versturen als er een persoon is bijgekomen, verwijderd etc. Omdat je dit vaker tegenkomt, heb ik die support class geschreven waarin die allemaal voor je gedaan wordt.

Verder kan die tablemodel luisteren naar die list en op het moment dat hij op de hoogste gesteld wordt van een verandering (dmv een ListEvent) gaat hij de juiste acties ondernemen.

Ken je verder PropertyChangeSupport class? ListSupport is iets soortgelijks.

  • VinnieM
  • Registratie: September 1999
  • Laatst online: 29-11-2024
Als er een object aan je TableModel is toegevoegd, moet het TableModel wel een of ander event afvuren. Dit kan met behulp van de 'fireTable*' methoden uit AbstractTableModel.
Verder kun je voor dynamische grootte van de tabel beter een collection gebruiken idd. Ik gebruik zelf vaak een Vector en de objecten die daar inkomen implementeren een eigen gemaakte interface waardoor je een datamember voor elke kolom kunt selecteren.

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

Alarmnummer

-= Tja =-

Het probleem aan jouw aanpak is dat je gui en logica weer met elkaar aan het mengen bent en je ook behoorlijk afstapt van mvc. Met mijn aanpak kun je model en gui goed van elkaar ontkoppelen. Sun die maakt zoveel api`s, maar ik vind het een beetje sneu dat ze libraries zoals ik die gemaakt hebt missen.

En ik wil niet zeggen dat ik nou zo fantastisch ben, maar dit is echt gewoon een voortzetting van mvc.
Pagina: 1