2010-04-10 21 views
4

J'essaie d'utiliser une colonne vide comme diviseur entre des paires de colonnes dans un JTable. Voici une image et un code pour ce que j'ai jusqu'ici. Je sais que je peux changer le look en utilisant un TableCellRenderer personnalisé. Avant de me lancer dans cette voie, y a-t-il une meilleure façon de faire? Toutes les idées ont apprécié.Utilisation d'une colonne vide comme diviseur dans un JTable

TablePanel.png http://i42.tinypic.com/1zxpfkj.png

import javax.swing.*; 
import javax.swing.table.*; 

public class TablePanel extends JPanel { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame("TablePanel"); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.add(new TablePanel()); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 

    public TablePanel() { 
     TableModel dataModel = new MyModel(); 
     JTable table = new JTable(dataModel); 
     table.getColumnModel().getColumn(MyModel.DIVIDER).setMaxWidth(0); 
     JScrollPane jsp = new JScrollPane(table); 
     jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     this.add(jsp); 
    } 

    private static class MyModel extends AbstractTableModel { 

     private static final int DIVIDER = 2; 
     private final String[] names = { "A1", "A2", "", "B1", "B2" }; 

     @Override 
     public int getRowCount() { 
      return 32; 
     } 

     @Override 
     public int getColumnCount() { 
      return names.length; 
     } 

     @Override 
     public String getColumnName(int col) { 
      if (col == DIVIDER) return ""; 
      return names[col]; 
     } 

     @Override 
     public Object getValueAt(int row, int col) { 
      if (col == DIVIDER) return ""; 
      return (row + 1)/10.0; 
     } 

     @Override 
     public Class<?> getColumnClass(int col) { 
      if (col == DIVIDER) return String.class; 
      return Number.class; 
     } 
    } 
} 

Répondre

8

En cas de problème avec cette approche, l'utilisateur devra "tabuler" la colonne de séparation. Vous pouvez utiliser la suggestion Table Tabbing pour le rendre plus convivial.

Ou si la tabulation entre les deux tables n'est pas importante, alors peut-être vous pouvez utiliser deux tables et mettre n'importe quel diviseur entre les deux. Le modèle de sélection peut être partagé si nécessaire.

Edit:

Comme je l'ai suggéré plus haut modèles de partage est plus facile que d'écrire les auditeurs personnalisés. Pour garder le défilement synchronisé le code serait:

jspa.getVerticalScrollBar().setModel(jspb.getVerticalScrollBar().getModel()); 

Vous pouvez également faire la même chose avec le modèle de sélection de telle sorte que les lignes de mettre en évidence est synchronisé.

+0

+1 Merci de me rappeler tabulant. Ce n'est pas important pour ça, mais l'article est bon. Mon idée de colonne vide a également fait un problème de tri. –

+0

Oh, c'est ce que ça veut dire! Je l'ai changé ci-dessous. Merci. –

2

Sans savoir ce que vous voulez montrer dans ce tableau, il est difficile de dire si vous avez sélectionné la bonne solution ou non.

En ce qui concerne cette solution. Cette colonne ne ressemble pas à un diviseur. Peignez-le avec du gris/une autre couleur, ou peignez une cellule d'en-tête de diviseur en blanc.

Mais de toute façon je préférerais JScrollPane + deux tables à l'intérieur à la place de cette solution.

5

J'ai un peu combiné les deux réponses: J'ai utilisé deux tables qui partagent sa barre de défilement. Cela fonctionne avec le tri, et cela rend le modèle plus simple. Tabbing n'a pas d'importance, mais en comparant "A" et "B" fait. Je pense que j'essayais de résoudre un problème de "vue" dans le "modèle". J'ai fait une réponse distincte, car j'apprécierais tout commentaire critique.

TablePanel http://i41.tinypic.com/2uqdtmo.png

public TablePanel() { 
    this.setLayout(new GridLayout(1, 0, 8, 0)); 

    JTable tableA = new JTable(new MyModel("A")); 
    tableA.setPreferredScrollableViewportSize(new Dimension(200, 400)); 
    final JScrollPane jspA = new JScrollPane(tableA); 
    jspA.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
    this.add(jspA); 

    JTable tableB = new JTable(new MyModel("B")); 
    tableB.setPreferredScrollableViewportSize(new Dimension(200, 400)); 
    final JScrollPane jspB = new JScrollPane(tableB); 
    jspB.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    this.add(jspB); 

    tableA.setSelectionModel(tableB.getSelectionModel()); 
    jspA.getVerticalScrollBar().setModel(jspB.getVerticalScrollBar().getModel()); 
} 
+1

Voir ma modification ci-dessus. – camickr

1

S'il vous plaît jeter un oeil à la réponse de cette question, une belle nouvelle suggestion a été donnée là: Column dividers in JTable or JXTable

+0

Ce n'est pas ce que je cherchais, il se trouve, mais peut-être utile à quelqu'un d'autre qui atterrit ici. +1 –