2009-02-19 9 views
1

J'ai des problèmes avec JTables. J'ajoute deux tables à un panneau, les tables sont dans un panneau de défilement, mais quand l'application apparaît, les tables occupent toujours plus d'espace que le nombre de rangées, gaspillant mon espace disponible.Java Swing Table taille

J'utilise groovy et SwingBuilder pour créer les tables, voici le code:

scrollPane(){ 
    panel(layout: new MigLayout('wrap 3')) { 
     //main title 
     label(text: '<html><h1>blah</h1></html>',constraints: 'span 3') //title 

     //tables 
     def data = [[text: "ABC", combo: "abc"], [text: "DEF", combo: "def"]] 
     def items = ['abc', 'def', 'ghi', 'jkl'] 
     def tableModelListener = { e -> println "${e.firstRow} ${e.column} ${e.type}" } as TableModelListener 
     scrollPane(constraints: 'span 3') { 
      table(id: 'serviceTable') { 
       current.setFillsViewportHeight(false) 
       tableModel(list: data) { 
        current.addTableModelListener(tableModelListener) 
        propertyColumn(header: 'Text', propertyName: 'text') 
        propertyColumn(header: 'Combo', propertyName: 'combo') 
       } 
      } 
     } 
     scrollPane(constraints: 'span 3') { 
      table(id: 'groupsTable') { 
       tableModel(list: data) { 
        current.addTableModelListener(tableModelListener) 
        propertyColumn(header: 'Text2', propertyName: 'text') 
        propertyColumn(header: 'Combo2', propertyName: 'combo') 
       } 
      } 
     } 
    } 
} 

Et voici le résultat: Image http://img517.imageshack.us/img517/6508/15181501ym9.jpg

Ce que je veux est de faire la hauteur de la table selon la nombre de rangées, et si possible je voudrais que la table occupe également toute la largeur. Je pense que mon problème est lié aux panneaux parents, mais je ne peux pas trouver la cause.

+0

Le lien d'image est maintenant mort, rendant la question peu claire. –

Répondre

1

@jfpoilpret est correct en ce que la taille préféréeScrollableViewpoet doit être gérée. Le moyen groovy serait de le lier à la taille préférée de la table. Donc, si cela a été ajouté à l'intérieur de l'élément scrollpane extérieur il suivre automatiquement la taille:

[serviceTable, groupsTable].each { table -> 
    bind(source:table, sourceProperty:'preferredSize', 
     target:table, targetProperty:'preferredScrollableViewportSize', 
     converter: { ps -> 
      [ps.width + 100, 
       (table.rowCount > 20 ? 20: table.rowCount) * table.rowHeight] 
     }) 
} 

On peut aussi faire des choses agréables, avec la liaison comme l'ajout d'un convertisseur qui limiteront la hauteur à 20 lignes (ou tout ce que vous Je veux qu'il soit limité à) donc nous avons toujours des barres de défilement quand la table devient trop longue.

+0

Merci, c'est toujours bon d'apprendre quelque chose de nouveau :) –

4

Oui, c'est un problème connu avec JTables. Par défaut, il affiche 20 lignes, quel que soit le contenu réel.

Si vous voulez changer que vous devez utiliser le code comme suit:

static public void setTableHeight(JTable table, int rows) 
{ 
    int width = table.getPreferredSize().width; 
    int height = rows * table.getRowHeight(); 
    table.setPreferredScrollableViewportSize(new Dimension(width, height)); 
} 

Ensuite, il suffit d'appeler setTableHeight(5); si vous voulez 5 lignes visibles par défaut.

Note: ceci est Java, vous devrez peut-être l'adapter légèrement à Groovy.

C'est quelque chose que j'ai described in my blog le mois dernier (item # 7).