2009-08-17 5 views
0

J'ai une jtable à l'intérieur d'un scrollpane. Comment puis-je empêcher le scrollpane de défiler vers le haut ou vers le bas lorsqu'une cellule partiellement hors de vue est mise au point? Le problème est que je mets les cellules à éditables quand l'utilisateur les survole, alors quand vous passez la souris sur une cellule qui est partiellement hors de vue, la vue change soudainement. Je n'aime pas ce comportement. des idées sur la façon de le changer?Désactiver le défilement vers la cellule en cours

+0

faire défiler la cellule éditée dans le rect visible est le comportement par défaut _not_ au démarrage d'une modification par programmation (via editCellAt, vérifié jdk 6/7) - pourrait être votre code change la sélection avec le démarrage de l'édition? – kleopatra

Répondre

2

Vous pouvez essayer d'appeler "setAutoscrolls (false)" sur votre table.

Bien que le javadoc parle de la gestion des événements de déplacement de la souris, il doit également désactiver le défilement des sections ligne/cellule.

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

public class TableTest extends JFrame { 

    private JTable table; 
    /** 
    * Create a new TableTest Frame. 
    * @param title The title of the frame. 
    */ 
    public TableTest() { 

     Object[][] tableData = new Object[][] { 
       {1, "One"}, {2, "Two"}, {3, "Three"}, 
       {4, "Four"}, {5, "Five"}, {6, "Six"}}; 

     DefaultTableModel tableModel = new DefaultTableModel(tableData, new String[] {"A", "B"}); 
     table = new JTable(tableModel); 
     table.setAutoscrolls(false); 

     JScrollPane scrolly = new JScrollPane(table); 
     setLayout(new BorderLayout()); 
     add(scrolly, BorderLayout.CENTER); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     TableTest frame = new TableTest(); 
     frame.pack(); 
     frame.setSize(200, 100); 
     frame.setVisible(true); 
    } 
} 
+0

J'ai essayé la méthode suggérée à la fois sur le scrollpane et sur le jtable et je n'ai pas changé le comportement que j'ai décrit. – Victor

+0

Étrange. À moins d'avoir mal compris ce que vous essayez de faire, cela a vraiment fonctionné pour moi. J'ai posté l'exemple de code que j'ai utilisé pour le tester. Vous devriez obtenir un comportement différent lorsque l'appel setAutoscrolls (false) est supprimé/ajouté. – Aaron

+0

lié au démarrage d'une modification par programmation (fi à une cellule en dehors de la plage visible) le comportement est affecté par la propriété autoscrolls: l'éditeur est _never_ défilant dans le rect visible :-) On dirait que @Viktor a fait quelque chose dans son code init personnalisé explicitement changé la sélection? Difficile à dire après toutes ces années ... – kleopatra

0

Il m'a fallu des heures de recherche, mais je l'ai eu pour travailler pour moi.

Remplacer cette méthode avec votre sous-classe JTable

public void scrollRectToVisible(java.awt.Rectangle aRect) 
    { 
     if(getAutoscrolls()) 
     super.scrollRectToVisible(aRect); 
    } 

Maintenant table.setAutoscrolls(false) devrait fonctionner correctement.

+0

cela viole (au moins dur à la limite de) le contrat de scrollRectToVisible: c'est _le_ moyen de faire défiler une partie arbitraire d'un composant dans le rect visible, donc doit être disponible sans condition. – kleopatra

Questions connexes