2012-07-09 16 views
5

Ho un JScrollPane il cui riquadro del contenuto è JXList. Quando uso la rotella del mouse nell'elenco, l'elenco esegue tre (3) elementi alla volta. Questo funziona anche per una tabella, indipendentemente dall'altezza della riga. Come posso cambiare questo in modo che, indipendentemente dalla piattaforma, sia per la lista che per la tabella la distanza di scorrimento sia esattamente di 1 articolo? L'impostazione dell'incremento del blocco non lo taglia perché alcune righe nella tabella hanno un'altezza diversa.Come rendere JScrollPane scorrere 1 riga per passo della rotellina del mouse?

+0

@trashgod non ha cercato per un po '- la ruota sembra davvero mappare l'unità Incremento in qualche modo, e gestisce le singole altezze delle file, quindi era sbagliato con il mio dubbio. Modificando l'implementazione scorrevole potrebbe essere utile, dopo tutto :-) – kleopatra

+2

Vedere il [Controller rotellina del mouse] di camickr (http://tips4java.wordpress.com/2010/01/10/mouse-wheel-controller/) – aterai

+0

@aterai hach ​​.. Dimenticavo quello :-) Sicuramente la strada da percorrere, considera di fare del tuo commento una risposta, per prendere dei veri voti. – kleopatra

risposta

7

Fuori di interesse puro (e un po 'di noia) ho creato un esempio di lavoro:

/** 
* Scrolls exactly one Item a time. Works for JTable and JList. 
* 
* @author Lukas Knuth 
* @version 1.0 
*/ 
public class Main { 

    private JTable table; 
    private JList list; 
    private JFrame frame; 

    private final String[] data; 

    /** 
    * This is where the magic with the "just one item per scroll" happens! 
    */ 
    private final AdjustmentListener singleItemScroll = new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(AdjustmentEvent e) { 
      // The user scrolled the List (using the bar, mouse wheel or something else): 
      if (e.getAdjustmentType() == AdjustmentEvent.TRACK){ 
       // Jump to the next "block" (which is a row". 
       e.getAdjustable().setBlockIncrement(1); 
      } 
     } 
    }; 

    public Main(){ 
     // Place some random data: 
     Random rnd = new Random(); 
     data = new String[120]; 
     for (int i = 0; i < data.length; i++) 
      data[i] = "Set "+i+" for: "+rnd.nextInt(); 
     for (int i = 0; i < data.length; i+=10) 
      data[i] = "<html>"+data[i]+"<br>Spacer!</html>"; 
     // Create the GUI: 
     setupGui(); 
     // Show: 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void setupGui(){ 
     frame = new JFrame("Single Scroll in Swing"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
     frame.add(split); 

     // Add Data to the table: 
     table = new JTable(new AbstractTableModel() { 
      @Override 
      public int getRowCount() { 
       return data.length; 
      } 

      @Override 
      public int getColumnCount() { 
       return 1; 
      } 

      @Override 
      public Object getValueAt(int rowIndex, int columnIndex) { 
       return data[rowIndex]; 
      } 
     }); 
     for (int i = 0; i < data.length; i+=10) 
      table.setRowHeight(i, 30); 
     JScrollPane scroll = new JScrollPane(table); 
     // Add out custom AdjustmentListener to jump only one row per scroll: 
     scroll.getVerticalScrollBar().addAdjustmentListener(singleItemScroll); 
     split.add(scroll); 

     list = new JList<String>(data); 
     scroll = new JScrollPane(list); 
     // Add out custom AdjustmentListener to jump only one row per scroll: 
     scroll.getVerticalScrollBar().addAdjustmentListener(singleItemScroll); 
     split.add(scroll); 
    } 

    public static void main(String[] agrs){ 
     new Main(); 
    } 
} 

La vera magia è fatto in costume AdjustmentListener, dove andiamo e aumentare la corrente "scroll-position" di un solo blocco per volta. Funziona su e giù e con diverse dimensioni di riga, come mostrato nell'esempio.


Come @kleopatra citato nei commenti, è possibile utilizzare anche un MouseWheelListener solo ridefinire il comportamento della rotella del mouse.

Vedere il tutorial ufficiale here.

+0

Questo è dannatamente fantastico. Grazie mille! Voglio dire, certo, là/potrebbe/essere un .setScrollIncrement (int i) da qualche parte, ma in questo modo funziona anche. Solo una breve parentesi: questo codice rende la funzione della barra di scorrimento (facendo clic sulla barra al di fuori della maniglia) per scorrere piccoli passi, il che non è molto strano considerando che il tuo codice imposta l'incremento del blocco su 1 "globalmente". C'è un modo per cambiare la dimensione del passo della rotellina del mouse? Inoltre, puoi consigliare un libro su Swing? – xmjx

+0

Ah, devo commentare un po 'di più. Ero curioso perché setBlockIncrement (1) deve essere chiamato ogni volta che viene chiamato AdjustmentListener, quindi ho disattivato il listener e chiamato setBlockIncrement (1) una volta al momento della creazione del riquadro di scorrimento. Ecco! Anche questo funziona con lo stesso indesiderato effetto collaterale. Non riesco a ricordare quale fosse l'effetto della mia macchina da ufficio, quindi domani metterò alla prova questo lavoro. A volte non mi piace Swing. ;-) – xmjx

+0

@xmjx per swing, basta leggere le esercitazioni fornite da sun/oracle. Non ho letto un libro dedicato per questo. Swing è piuttosto potente, ma non è nemmeno il più piccolo framework GUI. –

Problemi correlati