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

Résolu
Signaler
Messages postés
29
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
12 décembre 2011
-
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
-
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

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
366
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);
}

}

Messages postés
29
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
12 décembre 2011

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
@ +++
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
366
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);
}

}

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
366
Et une petite remarque : pour mettre des valeurs dans la JList, il vaut mieux utiliser les ListModel que de passer un tableau en argument.
Messages postés
29
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
12 décembre 2011

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 !
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
366
Je regarde si je trouve un truc attend une seconde.
Messages postés
29
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
12 décembre 2011

super l'astuce j'y avais pas penser, c'est nickel ça fonctionne exactement comme je le voulais!
Merci pour tout !
@ +++
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
366
DE rien.

Bon courage pour la suite de ton travail.

Peux tu accepter la réponse stp ?
Messages postés
29
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
12 décembre 2011

Voilà qui est fait !
Merci encore pour ton aide !
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
366
C'est plus élégant comme solution.

Je le note, ça pourra être utile.

a+