[JAVA] Kolomeigenschappen bij tabelvulling uit database

Pagina: 1
Acties:

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Goeiemiddag,

Sinds een jaar ben ik bezig met object georiënteerd programmeren in JAVA, hierbij werk ik ook veel met databases (MS Access, MSSQL).

Een veel voorkomende manier om database gegevens zichtbaar te maken voor de gebruiker is het vullen van een JTable met de resultset van een query, echter zit ik met het probleem dat alle kolommen dezelfde breedte, kleur etc hebben. Er zijn wel wat zaken die ik in de query af kan handelen, zoals het toewijzen van een kolomnaam, maar het is vrij vervelend als je 11 kolommen hebt met allemaal dezelfde breedte (bij kolom 1 valt tekst weg, terwijl bij kolom 6 nog witte ruimte over is).

Nu heb ik al flink zitten googlen, en is het aanpassen van een kolom in principe niet zo moeilijk, mits het om een statische content gaat, dus gegevens die zelf ingeprogrammeerd worden.

Heeft iemand een tip om deze kolommen qua breedte aan te passen? Ik neem aan dat het in de query meegegeven kan worden ergens maar daar heb ik nog niets over kunnen vinden.

Alvast bedankt,

Martijn

Verwijderd

Ik denk dat je de JTable een tablemodel moet toewijzen, deze kan je dan opmaken.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:51

Robtimus

me Robtimus no like you

Verwijderd schreef op dinsdag 17 juli 2007 @ 12:43:
Ik denk dat je de JTable een tablemodel moet toewijzen, deze kan je dan opmaken.
Helaas, zo werkt het niet. Het TableModel is alleen het model voor de data, de representatie gaat totaal anders.

Je moet een TableColumn hebben, die krijg je oa met JTable.getColumn(), of JTable.getColumnModel().getColumn(). Die kun je een minimum width geven, maximum width, of huidige width. Ook kun je eens kijken naar JTable.setAutoResizeMode(). Vooral AUTO_RESIZE_OFF kan erg handig zijn.

Wat betreft de kleuren, daarvoor moet je werken met TableCellRenderers. Die kun je per specifieke TableColumn instellen, of per class. Dit laatste doe je dmv JTable.setDefaultRenderer(). Als de class van je TableModel (getColumnClass) overeenkomt met de opgegeven class wordt die TableCellRenderer gebruikt.

Al met al is het een complex maar krachtig iets, de hele JTable architectuur.


Houd er trouwens wel rekening mee dat je altijd de goede index meegeeft; de index uit het model hoeft niet gelijk te zijn aan die van de JTable. Gelukkig heeft die laatste daarvoor convertColumnIndexToMode() en convertColumnIndexToView().

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Bedankt voor je reactie IceManX... hier kan ik wel wat mee.

Zojuist wat zitten spelen met de verschillende opties binnen de setAutoResizeMode... wat ik begrijp is dat die ervoor zorgt hoe de kolommen verder geresized worden op het moment dat met de hand een bepaalde kolombreedte gewijzigd wordt.

Wat misschien een betere oplossing is, is de kolombreedte aan laten passen aan de grootste waarde die in de velden staan. Ik wil dan het resizen afvangen door een JTable.getTableHeader().setResizingAllowed(false); in te voeren. De tabel bevat zowel een horizontale als een verticale JScrollPane

Wat betreft de kleuren, dit heeft een iets lagere prioriteit, maar ik zal ook even kijken of ik wat wijzer kan worden uit je informatie.

Ik hoop nog iets van je te horen

Thnx, Martijn

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Excuses bij voorbaat als dit niet is toegestaan, maar ik constateer dat deze niet meer zichtbaar is in het overzicht.

Kan er misschien gekeken worden naar mijn post hierboven?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:51

Robtimus

me Robtimus no like you

Teeno schreef op woensdag 18 juli 2007 @ 16:04:
Excuses bij voorbaat als dit niet is toegestaan, maar ik constateer dat deze niet meer zichtbaar is in het overzicht.
Een topic mag minimaal 24 uur na de laatste post gekicked worden, dus dit is geen probleem.
Kan er misschien gekeken worden naar mijn post hierboven?
Wat is het probleem, wat wil je verder nog weten?

Trouwens, je zult auto resize op AUTO_OFF moeten zetten, omdat dat de enige manier is om een JTable niet te beperken tot de parent container. Anders wordt, zeker met JScrollPanes of met een BorderLayout, je JTable geresized en daarmee je kolommen ook.
Je kunt inderdaad verder resizing uitzetten, en dan elke kolom een specifieke size meegeven. Deze combinatie zou dan prima moeten werken.

Wat trouwens een goede manier is om slechts enkele kolommen niet resizable te maken is ze een gelijke minimum en maximum size te geven. De minimum en maximum size worden namelijk gerespecteerd zolang a) auto resize off staat, of b) er minstens 1 kolom is die zodanig kan resizen dat de andere kolommen hun minimum en maximum sizes kunnen behouden.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
IceManX schreef op woensdag 18 juli 2007 @ 16:43:
Trouwens, je zult auto resize op AUTO_OFF moeten zetten, omdat dat de enige manier is om een JTable niet te beperken tot de parent container. Anders wordt, zeker met JScrollPanes of met een BorderLayout, je JTable geresized en daarmee je kolommen ook.
Helder, hierover heb ik verder geen onduidelijkheden
IceManX schreef op woensdag 18 juli 2007 @ 16:43:
Je kunt inderdaad verder resizing uitzetten, en dan elke kolom een specifieke size meegeven. Deze combinatie zou dan prima moeten werken.
Als ik het goed begrijp geef je kolommen aan de hand van een index een vaste size, waar ik uiteindelijk heen wil is de size aanpassen aan de lengte van een waarde in de kolom. Zodat alle gegevens zichtbaar zijn. Door de horizontale JScrollPane kan het dan zo breed worden als je zelf wilt
IceManX schreef op woensdag 18 juli 2007 @ 16:43:
Wat trouwens een goede manier is om slechts enkele kolommen niet resizable te maken is ze een gelijke minimum en maximum size te geven. De minimum en maximum size worden namelijk gerespecteerd zolang a) auto resize off staat, of b) er minstens 1 kolom is die zodanig kan resizen dat de andere kolommen hun minimum en maximum sizes kunnen behouden.
Dit is in mijn applicatie niet van toepassing, maar bedankt voor de info, dit wist ik ook nog niet.

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 19-11 12:23
Bedankt voor de link maar...

..ik kan ook hier weinig (lees: niets) vinden over tabellen met een dynamische opmaak... aan de hand van wat er in de database staat moet hij de kolombreedte aan gaan passen

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:51

Robtimus

me Robtimus no like you

Teeno schreef op woensdag 18 juli 2007 @ 18:10:
Als ik het goed begrijp geef je kolommen aan de hand van een index een vaste size, waar ik uiteindelijk heen wil is de size aanpassen aan de lengte van een waarde in de kolom. Zodat alle gegevens zichtbaar zijn. Door de horizontale JScrollPane kan het dan zo breed worden als je zelf wilt
Mbv java.awt.FontMetrics kun je berekenen hoeveel pixels een string in beslag zal nemen. Je moet dan per kolom alle rijen doorlopen en de maximum lengtes opslaan, en vervolgens de sizes van je kolommen zetten.

FontMetrics kun je krijgen door van een Component (dus ook je JTable) de getFontMetrics method aan te roepen, in combinatie met getFont van hetzelfde Component.


Let erop dat dit geheel bij grote data sets lang kan gaan duren omdat je elke cel van de tabel moet controleren. En wat ga je doen als je tabel velden bevat met text die meerdere regels heeft?

Edit: dat berekenen van de lengtes kun je misschien doen terwijl je je data model vult. Niet helemaal netjes uit design oogpunt omdat je tijdens het vullen van je model al de view (de JTable) gebruikt, maar ok. Het is wel efficienter.

[ Voor 10% gewijzigd door Robtimus op 19-07-2007 21:37 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1