Toon posts:

[Java] JTable Headers worden niet weergegeven

Pagina: 1
Acties:

Verwijderd

Topicstarter
Zoals de titel al aangeeft, worden de headers van een JTable niet weergegeven. Tenminste, niet in mijn programmaatje :P
Als ik de voorbeeldcode van de sun website in een programma plak, dan werkt het allemaal perfect. Plak ik de code daarna in een eigen programma, dan worden de headers ineens niet meer weergegeven. Hoe kan dat?? En hoe kan ik dit oplossen??

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Object[][] data = {
        {"Mary", "Campione",
         "Snowboarding", new Integer(5), new Boolean(false)},
        {"Alison", "Huml",
         "Rowing", new Integer(3), new Boolean(true)},
        {"Kathy", "Walrath",
         "Chasing toddlers", new Integer(2), new Boolean(false)},
        {"Mark", "Andrews",
         "Speed reading", new Integer(20), new Boolean(true)},
        {"Angela", "Lih",
         "Teaching high school", new Integer(4), new Boolean(false)}
    };

    String[] columnNames = {"First Name",
                            "Last Name",
                            "Sport",
                            "# of Years",
                            "Vegetarian"};

    table = new JTable(data, columnNames);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));

Verderop wordt hij aan het scherm toegevoegd, (in een JScrollPane en daarna in een JTabbedPane) maar daar zit het probleem denk ik niet.

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

Alarmnummer

-= Tja =-

De code die je hier hebt gegeven die moet volgens mij wel werken. Het probleem zit hem in het feit dat de header model niet gezet wordt (geloof ik.. ik heb al een tijd niets meer gedaan met Swing). Ik werk zelf altijd met een tablemodel om dit soort ellende een beetje te voorkomen.

Verwijderd

Topicstarter
Ik had dus eerst ook zo'n tablemodel aangemaakt, maar dat werkte dus niet. Toen ben ik dus hier en op sun gaan zoeken en kwam ik een tut tegen, deze heb ik gecompiled en hij liet een mooie tabel zien, met headers, dus ik dacht dat ik het had gevonden, maar toen ik de code in mijn eigen classe plakte, toen werden de headers dus niet meer weergegeven.
Een headermodel heb je btw niet perse nodig. (volgens sun dan)

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

Alarmnummer

-= Tja =-

Als je zegt:
table.setTableModel(...) dan zou het die headers er echt bij moeten plaatsen. Maar verander jij de inhoud van de tabel? Als dat zou is, dan kun je echt veel beter werken met een tablemodel

Verwijderd

Topicstarter
Ik verander de inhoud inderdaad, maar ik dacht als ik eerst een tut eens werkend krijg, dan ben ik al weer wat verder.......
Kun je anders even globaal uitleggen hoe jij die TableModels maakt?? Want bij mij werkte die dus ook niet...

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

Alarmnummer

-= Tja =-

Deze is nog even wat makkelijker te begrijpen.

final class RelationTableModel extends AbstractTableModel {
private final String[] columnNames = {"Primary columns", "Foreign columns"};
private final static int PRIMARY_COLUMN_INDEX = 0;
private final static int FOREIGN_COLUMN_INDEX = 1;

private DbRelation dbRelation = null;
private DbRelationColumnPairList dbRelationColumnPairList = null;

public RelationTableModel(DbRelation dbRelation) {
super();

this.dbRelation = dbRelation;
this.dbRelationColumnPairList = dbRelation.getDbRelationColumnPairList();
}

public int getRowCount() {
return dbRelationColumnPairList.size();
}

public int getColumnCount() {
return columnNames.length;
}

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


public boolean isCellEditable(int nRow, int nCol) {
return false;
}

public Object getValueAt(int nRow, int nCol) {
if (nRow < 0 || nRow >= getRowCount())
return "";

DbRelationColumnPair dbRelationColumnPair = dbRelationColumnPairList.get(nRow);

Object answer = null;
switch (nCol) {
case PRIMARY_COLUMN_INDEX:
answer = dbRelationColumnPair.getPrimaryColumn().getName();
break;
case FOREIGN_COLUMN_INDEX:
answer = dbRelationColumnPair.getForeignColumn().getName();
break;
default:
answer = "should not happen";
}

return answer;
}
}

Verwijderd

Topicstarter
Als ik deze classe dus ff herschrijf, zodat de database gevalletjes eruit vallen en ik gewoon met een 2-dimensionale Object Array werk, dan krijg ik de headers nog steeds niet te zien :? :?
Snap er echt helemaal niets meer van. Heb je enig idee waar het aan zou kunnen liggen???

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

Alarmnummer

-= Tja =-

Op zich zou het moeten werken, maar ik heb zo`n vermoeder dan het bij het aanmaken van die table niet helemaal goed gaat. Post de code eens van het aanmaken van die table en het veranderen van die tablemodel. (Trouwens die tablemodel die hoeft niet vervangen te worden).

Verwijderd

Topicstarter
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private Object[][] data = {
        {"Mary", "Campione",
         "Snowboarding", new Integer(5), new Boolean(false)},
        {"Alison", "Huml",
         "Rowing", new Integer(3), new Boolean(true)},
        {"Kathy", "Walrath",
         "Chasing toddlers", new Integer(2), new Boolean(false)},
        {"Mark", "Andrews",
         "Speed reading", new Integer(20), new Boolean(true)},
        {"Angela", "Lih",
         "Teaching high school", new Integer(4), new Boolean(false)}
    };
  private String[] columnNames = {"First Name",
                            "Last Name",
                            "Sport",
                            "# of Years",
                            "Vegetarian"};

tableModel = new TableModel(columnNames,data);
userTable = new JTable(tableModel);

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
package servergui;

import javax.swing.table.*;

final class TableModel extends AbstractTableModel {
  private final String[] columnNames;
  private final Object[][] data;

  public TableModel(String[] columnNames, Object[][] data) {
    super();
    this.data = data;
    this.columnNames = columnNames;
  }

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

  public int getColumnCount() {
    return columnNames.length;
  }

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


  public boolean isCellEditable(int nRow, int nCol) {
    return false;
  }

  public Object getValueAt(int nRow, int nCol) {
    return data[nRow][nCol];
  }
}

Als je nog meer nodig hebt, dan hoor ik het wel, maar volgens mij is dit allemaal goed.

BTW, ik moet nu echt weg, ben rond 11 uur / half 12 weer terug, dus een reactie kan op zich laten wachten. Iig bedankt

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

Alarmnummer

-= Tja =-

Dat ziet er allemaal goed uit en kan dus ook niets vreemds ontdekken. Dus ik waag ook maar een longshot. Heb je je table in een JScrollPane staan??

[edit]
het is toch:
String[] p = new String[]{"1","2",...};
ipv
String[] p = {"1","2",...}

Als dit syntactisch correct is, dan zal het wel kloppen. Maar ik heb het nog nooit zo gezien.

Verwijderd

Topicstarter
Hij staat inderdaad in een JScrollPane, en volgens de sun website kan
String[] p = {"1","2",....} gewoon. Neem aan dat het dan syntactisch (wat een woord zeg :D) correct is.

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

Alarmnummer

-= Tja =-

Ik denk dat ik het al weet.

Jij zet de model van de JTable nadat je hem in de JScrollpane hebt gezet, of niet?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
De headers van een JTable zijn inderdaad pas zichtbaar als je deze in een JScrollPane stopt.

Het is wel vreemd te noemen dat ze niet zichtbaar zijn als je een JTable niet een JScrollPane stopt. De scheiding tussen componenten en scrollen van componenten is zo een beetje merkwaardig: een JTable is eigenlijk niet bruikbaar buiten een JScrollPane. Misschien dat er wel een methode is om hem toch gewoon te laten zien, maar zou uiteraard al standaard moeten werken.

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


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

Alarmnummer

-= Tja =-

Als je een table in een scrollpane plaatst, dan maakt de scrollpane automatisch die headermodel aan. Maar als je dus na het plaatsen van die table in een scrollpane de model aanpast, zal er geen nieuw headermodel worden aangemaakt.

  • VinnieM
  • Registratie: September 1999
  • Laatst online: 29-11-2024
Wat je moet doen is de table header expliciet toevoegen aan je container.
Dus zoiets als:
code:
1
add(table.getTableHeader());

Dit moet wel werken. Als je daarna een scrollpane aanmaakt met daarin de table, en die scrollpane toevoegd aan de container, dan blijft de header altijd bovenaan zichtbaar (hij scrollt dus niet mee of zo).

Verwijderd

Topicstarter
Oke, hij werkt :):)
Ik heb dus de tableheader erin gezet, met .setBounds() erbij en ik heb hem aan het scrollpane toegevoegd, en nu werkt hij dus.
Iig bedankt voor jullie reacties.
Pagina: 1