Je souhaite supprimer les boutons fléchés de la barre de défilement d'une barre de défilement dans un JScrollPane. Comment ferais-je cela?Supprimer les flèches de la barre de défilement Swing dans JScrollPane
Répondre
Si vous utilisez la version de base de JScrollBar, il s'agit probablement d'un rendu avec BasicScrollBarUI. Je suggère que vous étendiez BasicScrollBarUI pour créer une classe d'interface utilisateur personnalisée (comme MyBasicScrollBarUI). Les boutons sont des variables protégées dans la superclasse. Vous devez donc remplacer les méthodes installComponents() de la sous-classe et vous assurer que vous n'ajoutez pas les boutons. Voir l'extrait de code ci-dessous et masquer les lignes comme suggéré ici.
protected void installComponents(){
switch (scrollbar.getOrientation()) {
case JScrollBar.VERTICAL:
incrButton = createIncreaseButton(SOUTH);
decrButton = createDecreaseButton(NORTH);
break;
case JScrollBar.HORIZONTAL:
if (scrollbar.getComponentOrientation().isLeftToRight()) {
incrButton = createIncreaseButton(EAST);
decrButton = createDecreaseButton(WEST);
} else {
incrButton = createIncreaseButton(WEST);
decrButton = createDecreaseButton(EAST);
}
break;
}
scrollbar.add(incrButton); // Comment out this line to hide arrow
scrollbar.add(decrButton); // Comment out this line to hide arrow
// Force the children's enabled state to be updated.
scrollbar.setEnabled(scrollbar.isEnabled());
}
Ensuite, dans votre code après l'initialisation d'un JScrollBar, vous pouvez appeler setUI() et passer dans une instance de la classe MyBasicScrollBarUI.
Note: Je n'ai pas essayé moi-même, mais d'après le code, il semble que cela puisse fonctionner.
class NoArrowScrollBarUI extends BasicScrollBarUI {
protected JButton createZeroButton() {
JButton button = new JButton("zero button");
Dimension zeroDim = new Dimension(0,0);
button.setPreferredSize(zeroDim);
button.setMinimumSize(zeroDim);
button.setMaximumSize(zeroDim);
return button;
}
@Override
protected JButton createDecreaseButton(int orientation) {
return createZeroButton();
}
@Override
protected JButton createIncreaseButton(int orientation) {
return createZeroButton();
}
@Override
protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
//own painting if needed
}
@Override
protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
//own painting if needed
}
}
boutons Suppression de laisser l'espace pour ensuite. J'ai trouvé que faire des boutons zéro comme le moyen le plus simple.
Cela fonctionne parfaitement !!! –
Il n'est pas la façon la plus élégante ... mais fonctionne pour moi
JScrollBar jsb = getHorizontalScrollBar();
for(Component c : jsb.getComponents()) {
jsb.remove(c);
}
Vous devriez probablement pas étendre l'interface utilisateur « de base ». Si vous le faites, vous perdez toutes les personnalisations LAF. Donc, vous devriez probablement étendre MetalScrollBarUI, ou quelle que soit l'interface utilisateur utilisée pour votre LAF. – camickr
@camickr: d'accord avec ça. L'extension de l'interface utilisateur de base était la manière la plus simple d'illustrer une solution possible. – Thimmayya
@Thimmayya J'ai essayé le code et tant que les flèches sont partis, les boutons sont toujours là. Je viens de modifier ma question pour spécifier la suppression du bouton. Merci pour l'idée cependant. – asawilliams