Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [JAVA] Spostamento della scrollbar di un JScrollPane

    Ciao a tutti,
    premetto che questa volta non ho nemmeno una vaga idea di come potrei farlo,
    ma è possibile spostare in giù una scrollbar di un JScrollPane se premendo tab
    si va su un component del pannello che non è possibile vedere?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Spostamento della scrollbar di un JScrollPane

    Originariamente inviato da lotus1989
    premetto che questa volta non ho nemmeno una vaga idea di come potrei farlo,
    ma è possibile spostare in giù una scrollbar di un JScrollPane se premendo tab
    si va su un component del pannello che non è possibile vedere?
    Si può fare. Il concetto, a grandi linee, dovrebbe essere questo: registrare un listener per "ascoltare" la acquisizione del "focus" sul/i componente/i e quando riceve il focus, se il suo "parente" è un JComponent, invocare su questo parente il scrollRectToVisible(rect) passando il rettangolo del componente che ha ricevuto il focus.
    In sostanza si dice: "senti parente, rendi visibile quella area (il componente)". Se il parente ha come "progenitore" un JViewport (del JScrollPane), avverrà lo scrolling effettivo.

    Se ci fossero molti componenti su cui registrare il listener o comunque non si vuole fare così, si può registrare un listener "globale" attraverso un addPropertyChangeListener di java.awt.KeyboardFocusManager.

    Se non è chiaro o ci sono dubbi, posso fare un esempio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: [JAVA] Spostamento della scrollbar di un JScrollPane

    Originariamente inviato da andbin

    Se non è chiaro o ci sono dubbi, posso fare un esempio.
    Hehe se posso ti rubo un mini esempietto se hai tempo.
    La situazione in cui mi trovo e quella di avere una 40ina di componenti
    che hanno reso necessario l'utilizzo di un JscrollPane di appoggio
    per fare uno scrollVerticale se lo schermo è troppo piccolo..
    Quello che vorrei fare è abbonare tutte le componenti a gestire questa possibilità di cambiamento
    però proprio a livello di codice non riesco bene a capire con che logica farlo..
    tipo se la 39esima component acquisisce il focus, io dovrei capirlo (penso focuslistner con getfocus)
    guardare se è visibile (cosa che non ho capito come capire)
    e poi dire allo scroll di adattare il contenuto che mi interessa a visibile...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Esempio per gestire lo scrolling automatico in modo globale:

    codice:
    import java.awt.*;
    import java.beans.PropertyChangeListener;
    import java.beans.PropertyChangeEvent;
    import javax.swing.*;
    
    public class TestFrame extends JFrame {
        public TestFrame() {
            super("Test Frame");
    
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(300, 250);
    
            JPanel panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    
            // ... molti componenti giusto per prova ...
            for (int i = 0; i < 20; i++) {
                panel.add(new JTextField());
                panel.add(new JButton(""+i));
            }
    
            // ... pannello dentro scroll-pane dentro content-pane ...
            getContentPane().add(new JScrollPane(panel));
    
            KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    
            // ... registra un listener "globale" per il focus ...
            kfm.addPropertyChangeListener("focusOwner", new PropertyChangeListener() {
                public void propertyChange(PropertyChangeEvent e) {
                    if (e.getNewValue() instanceof Component) {
                        Component comp = (Component) e.getNewValue();
                        Container parent = comp.getParent();
    
                        if (parent instanceof JComponent) {
                            // ... chiede al parente di rendere visibile l'area del componente ...
                            ((JComponent) parent).scrollRectToVisible(comp.getBounds());
                        }
                    }
                }
            });
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new TestFrame().setVisible(true);
                }
            });
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Originariamente inviato da andbin
    Esempio per gestire lo scrolling automatico in modo globale:

    codice:
    public class TestFrame extends JFrame {.....}
    Grazieissimeeeeeee!
    Appena torno questa sera lo provo e lo adatto al mio pannello
    devo dire che da solo non avrei nemmeno saputo dove metter mano (ora ne ho la conferma)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.