2010-08-13 31 views
1

J'ai configuré mon cadre avec un JTree sur la gauche et un JTable sur la droite, et j'ai utilisé un BorderLayout pour cela. Cependant, dès que je mets des données dans mon JTable, il s'étend pour couvrir presque toute la trame, et mon JTree avec elle. La table n'a actuellement aucune donnée (je vérifie mon SelectionListener), seulement quelques en-têtes de colonne qui totalisent quinze caractères. Il n'y a aucun moyen qu'il a besoin de l'espace supplémentaire.Problème avec JTable

Voici mon code de configuration:

primaryframe = new javax.swing.JFrame(); 
    primaryframe.setTitle("Bus Route Finder"); 
    primaryframe.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
    primaryframe.setSize(500, 500); 
    primaryframe.setLayout(
     new java.awt.BorderLayout() 
    ); 

    // Set up the tree and it's dependent objects(model, scrollpane, etc). 
    javax.swing.tree.DefaultMutableTreeNode node = new javax.swing.tree.DefaultMutableTreeNode(dataroot.GetName()); 
    node.setUserObject(dataroot); 
    CreateNodes(dataroot, node); 
    primaryframe.add(
     treescrollpane = new javax.swing.JScrollPane(
      datatree = new javax.swing.JTree(
       treemodel = new javax.swing.tree.DefaultTreeModel(
        node 
       ) 
      ) 
     ), 
     java.awt.BorderLayout.WEST 
    ); 
    datatree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { 
     public void valueChanged(javax.swing.event.TreeSelectionEvent e) { 
      javax.swing.JTree tree = (javax.swing.JTree)e.getSource(); 
      javax.swing.tree.DefaultMutableTreeNode newnode = (javax.swing.tree.DefaultMutableTreeNode)tree.getSelectionPath().getLastPathComponent(); 
      Controller.TreeData data = (Controller.TreeData)newnode.getUserObject(); 
      tablemodel.setNumRows(0); 
      tablemodel.setColumnCount(0); 
      for(int i = 0; i < data.GetNumberOfFields(); i++) { 
       tablemodel.addColumn(data.GetFieldName(i)); 
      } 
     } 
    }); 

    primaryframe.add(
     tablescrollpane = new javax.swing.JScrollPane(
      datatable = new JTable(
       tablemodel = new javax.swing.table.DefaultTableModel() 
      ) 
     ), 
     java.awt.BorderLayout.EAST 
    ); 

Répondre

2

BorderLayout est terriblement pointilleux. Je recommanderais d'utiliser GridLayout si vous savez que vous voulez seulement les deux éléments - avoir une ligne avec deux colonnes. Je ne sais pas si cela aidera ou non, mais j'ai toujours eu beaucoup plus de succès avec GridLayout.

Si vous souhaitez absolument utiliser BorderLayout, essayez de définir la taille maximale des objets qui s'y trouvent, tels que JTable, à l'aide de setMaximumSize (Dimension).

+0

Le problème avec GridLayout est que j'ai besoin que le JTree soit plus petit que le JTable - environ 25-33 à 75-66. Je veux dire, cela a effectivement résolu le problème, donc vous pouvez avoir la grosse tique verte. – Puppy

+0

Hmm ... tous les composants vont-ils s'étendre pour remplir l'espace prévu? Pourriez-vous définir la taille maximale pour qu'elle soit plus petite que la taille de grille donnée et que cela reste ainsi? GridBagLayout peut être mieux adapté à cela, même si je ne l'ai jamais utilisé personnellement. –

+0

Je suis retourné à BorderLayout, mais j'ai mis le JTable au centre. Maintenant ça joue bien. – Puppy