2009-05-03 7 views
1

En ce moment j'utilise un JTable pour ce que je fais. Après avoir parcouru l'API Java et diverses ressources web, je ne pense pas qu'un JTable va le couper. Ce que je cherche, c'est une table pour laquelle je peux spécifier des procédures de sélection très strictes. Je veux être capable non seulement de sélectionner des lignes et des colonnes, mais également de sélectionner des cellules dans une direction diagonale. Plus que cela, j'ai besoin de la capacité globale de pouvoir spécifier quelles cellules peuvent être sélectionnées dans une autre cellule. Par exemple, si j'ai une table 10x10 et que je suis dans la cellule (4, 3) [(ligne, colonne)], je veux pouvoir dire, d'accord, vous pouvez sélectionner les intervalles suivants à partir d'ici :JTable ou une autre classe de table Java avec une sélection de cellule avancée?

  • (4, 3) à (4, 10)
  • (4, 3) à (4, 1)
  • (4, 3) à (10, 4)
  • (4, 3) à (1, 4)
  • (4, 3) à (10, 10) [en diagonale]
  • (4, 3) à (1, 1) [en diagonale]
  • (4, 3) à (1, 6) [en diagonale]
  • (4, 3) à (6, 1) [diagonalement]

Toutes les idées pour comment je pourrais le faire?

Répondre

1

Ne semble pas que vous modélisez vraiment une «table». (JTable suppose une sémantique de table et utilise un modèle de sélection de liste.) Cependant, je ne pense pas que ce soit si éloigné d'une matrice, si vous êtes prêt à pirater le code JTable.

Une alternative est votre propre composant (yep): Un JPanel qui contient les cellules de la matrice. Tout le traitement des événements clavier/souris doit être délégué au parent JPanel. Je recommanderais certainement de cloner les sous-ensembles pertinents et la conception de JTable (modèle de données, modèle de sélection, etc.).

Donc, en gros, vous aurez besoin de 3 classes:

JMatrix, JMatrixModel, JMatrixSelectionModel. JMatrix est le JPanel étendu avec ses composants enfants. JMatrixSelectionModel est la classe qui implémentera les règles de sélection. Le JMatrix doit appeler le modèle de sélection sur les événements de sélection (enregistrés sur des cellules matricielles, déléguées au gestionnaire sur la JMatrix parent). Le modèle de données est assez simple - vous pouvez même utiliser JTableModel existant.

0

Je suis dans une situation similaire. Ma solution (désolé, je ne veux pas écrire une classe énorme) était d'ajouter un Cell Renderer pour toutes les colonnes qui était un écouteur souris pour la table. Puisque le Renderer sait quels boutons ont été sélectionnés, il peut les rendre différemment.

public class MultipleSelectionRenderer extends DefaultTableCellRenderer implements MouseListener { 
    private JTable table; 
    private Map<String, Boolean> selectedMap = new LinkedHashMap<String, Boolean>(); 
    TableUpdateIfc updater; 
public MultipleSelectionRenderer(TableUpdateIfc updater, JTable table, Map<String, Boolean> selectedMap) { 
    this.table = table; 
    this.selectedMap = selectedMap; 
    this.updater = updater; 
} 

@Override 
public void mouseReleased(MouseEvent e) { 
    if(e.getSource() == table){ 
     try { 
      if(!e.isControlDown()) 
       selectedMap.clear(); 
      selectedMap.put(table.getSelectedRow()+":"+table.getSelectedColumn(), true); 
     } catch (Exception ex) { 
      selectedMap.clear(); 
     } 
    } 
    updater.updateMultipleSelectionTable(table); 
} 
public void mouseEntered(MouseEvent e) {} 
public void mouseExited(MouseEvent e) { } 
public void mouseClicked(MouseEvent e) {} 
public void mousePressed(MouseEvent e) {} 

/** 
* 
* @param table 
* @param value 
* @param isSelected 
* @param hasFocus 
* @param row 
* @param column 
* @return 
*/ 
@Override 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    Component result =super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    if(selectedMap.get(row+":"+column) != null && selectedMap.get(row+":"+column) == true) { 
     setText(getHTMLString(value)); 
    } 
    return result; 
} 

private String getHTMLString(Object value){ 
    String html = "<html><body><table cellpadding=0><tr>"; 
    html = html + "<td bgcolor=#bf65a5>"; 
    html = html + value.toString(); 
    html = html + "</td><td>&nbsp;" + value+"</td>"; 
    html = html + "</tr></table></body></html>"; 
    return html; 
} 

}

Questions connexes