Comment faire pour que ma JScrollPane suive le focus de ma liste

Résolu
Darioo2 Messages postés 29 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 12 décembre 2011 - 5 déc. 2011 à 19:42
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 12 déc. 2011 à 21:05
Bonjour,
voici mon code:
liste = new JList();
liste.setSelectionMode(0);
liste.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, new Color(0, 0, 0), null, null, null));
liste.setBackground(new Color(255, 239, 213));
liste.setFont(new Font("Times New Roman", Font.PLAIN, 18));
panEditeur.add(liste);
// Barre de défilement
defil = new JScrollPane(liste);
panEditeur.add(defil);

J'ai 2 boutons prévus pour déplacer les éléments présents dans ma JList vers le haut et vers le bas, par contre quand je les déplace vers la partie non visible de la liste, la JScrollPane ne suis pas le focus !
Est ce qu'il y a un moyen de faire suivre le focus de la JList par le JScrollPane ?
Merci d'avance de votre aide !

10 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
7 déc. 2011 à 08:13
Pas terrible comme solution mais elle est simple :

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;





public class Test {


public static void main(String[] args) {
JFrame f = new JFrame();
f.getContentPane().setLayout(new BorderLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(200, 200);
f.setLocationRelativeTo(null);
final JList liste = new JList(new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"});
liste.setSelectionMode(0);
liste.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, new Color(0, 0, 0), null, null, null));
liste.setBackground(new Color(255, 239, 213));
liste.setFont(new Font("Times New Roman", Font.PLAIN, 18));
final JScrollPane scroll = new JScrollPane(liste);
JPanel sud = new JPanel(new GridLayout(1,0));
JButton monter = new JButton("Monter");
monter.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {
liste.requestFocusInWindow();
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_UP);
} catch (AWTException e) {
e.printStackTrace();
}

}
});
JButton descendre = new JButton("Descendre");
descendre.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {
liste.requestFocusInWindow();
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_DOWN);
} catch (AWTException e) {
e.printStackTrace();
}
}
});
sud.add(monter);
sud.add(descendre);
f.add(sud, BorderLayout.SOUTH);
f.add(scroll, BorderLayout.CENTER);
f.setVisible(true);
}

}

3
Darioo2 Messages postés 29 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 12 décembre 2011
12 déc. 2011 à 18:46
J'ai trouver finalement une autre solution qui prend dirrectement l'index voulu et qui ajuste le scroll de manière a le rendre visible.
c'est la méthode liste.ensureIndexIsVisible(int index) de JList
@ +++
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
6 déc. 2011 à 08:38
Bonjour,

Tu peux essayer ceci. Ca fonctionne si on parcourt la liste en utilisant les fleches du clavier. Je pense que ca doit également fonctionner avec tes boutons.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;


public class ListeTest extends JPanel {

public ListeTest(){
setLayout(new BorderLayout());
JList liste = new JList(new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"});
liste.setSelectionMode(0);
liste.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, new Color(0, 0, 0), null, null, null));
liste.setBackground(new Color(255, 239, 213));
liste.setFont(new Font("Times New Roman", Font.PLAIN, 18));
add(new JScrollPane(liste), BorderLayout.CENTER);

}

public static void main(String[] args){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new ListeTest());
f.setSize(200, 200);
f.setLocationRelativeTo(null);
f.setVisible(true);
}

}

0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
6 déc. 2011 à 08:39
Et une petite remarque : pour mettre des valeurs dans la JList, il vaut mieux utiliser les ListModel que de passer un tableau en argument.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Darioo2 Messages postés 29 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 12 décembre 2011
6 déc. 2011 à 16:38
Merci pour ta réponse,

Pour ce qui est des flèches, la le scrollpane suit correctement le focus dans la liste a partir du moment qu'un élément est selectionné, et que j'utilise les fleches pour le déplacer, mon probleme est que j'ai créer 2 boutons pour déplacer les éléments dans la liste et quand je déplace un élément et qu'il sort du cadre visible, la ScrollBar ne suit plus!
Il faudrais que je puisse intervenir sur la scrollpane et lui dire de se positionner a un endroit précis par exemple en lui donnant l'index qui est selectionner dans ma liste, est ce qu'il est possible d'intervenir sur la JScrollPane et en changer la position ?

PS: Je n'utilise pas les ListModel, mais je jetterais un oeil la dessus je ne conaissais pas !
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
7 déc. 2011 à 07:56
Je regarde si je trouve un truc attend une seconde.
0
Darioo2 Messages postés 29 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 12 décembre 2011
7 déc. 2011 à 15:34
super l'astuce j'y avais pas penser, c'est nickel ça fonctionne exactement comme je le voulais!
Merci pour tout !
@ +++
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
7 déc. 2011 à 15:55
DE rien.

Bon courage pour la suite de ton travail.

Peux tu accepter la réponse stp ?
0
Darioo2 Messages postés 29 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 12 décembre 2011
7 déc. 2011 à 16:13
Voilà qui est fait !
Merci encore pour ton aide !
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
12 déc. 2011 à 21:05
C'est plus élégant comme solution.

Je le note, ça pourra être utile.

a+
0
Rejoignez-nous