2012-07-09 17 views
5

Mam JScrollPane, którego okienko zawartości jest JXList. Kiedy używam kółka myszy na liście, lista wykonuje trzy (3) czynności jednocześnie. Działa to również dla tabeli, niezależnie od wysokości wiersza. Jak mogę to zmienić, aby - niezależnie od platformy - dla listy i tabeli odległość przewijania wynosiła dokładnie 1 pozycję? Ustawienie przyrostu bloku nie powoduje jego obcięcia, ponieważ niektóre wiersze w tabeli mają inną wysokość.Jak zrobić JScrollPane przewijać 1 linię na kółko myszy?

+0

@trashgod nie wyglądał przez jakiś czas - koło wydaje się być w rzeczywistości mapowane do unitIncrement i nie radzi sobie z pojedynczymi rzędami rzędów, więc nie miałem racji. Poprawienie przewijalnej implementacji może pomóc, w końcu :-) – kleopatra

+2

Zobacz camickr's [Sterownik kółka myszy] (http://tips4java.wordpress.com/2010/01/10/mouse-wheel-controller/) – aterai

+0

@aterai hach ​​.. Zapomniałem o tym :-) Zdecydowanie do zrobienia, zastanów się nad odpowiedzią na komentarz, aby zdobyć prawdziwe głosy. – kleopatra

Odpowiedz

7

z czystego zainteresowania (i trochę nudy) I stworzył przykład robocza:

/** 
* 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(); 
    } 
} 

Prawdziwa magia jest wykonywana w zwyczaju AdjustmentListener, gdzie jedziemy i zwiększyć prąd „przewijania pozycji” przez jeden pojedynczy blok na czas. Działa to w górę iw dół oraz w różnych rozmiarach wierszy, jak pokazano w przykładzie.


Jak @kleopatra wspomniano w komentarzach, można również użyć MouseWheelListener tylko przedefiniować zachowanie myszy koła.

Zobacz oficjalny samouczek: here.

+0

To jest cholernie niesamowite. Stukrotne dzięki! Mam na myśli, oczywiście, tam/could/be .setScrollIncrement (int i) gdzieś, ale w ten sposób również działa. Krótko mówiąc: Ten kod sprawia, że ​​funkcja paska przewijania (kliknięcie na pasku poza uchwytem) przewija kroki dziecka, co nie jest dziwne, biorąc pod uwagę, że twój kod ustawia przyrost bloku na 1 "globalnie". Czy istnieje sposób na zmianę rozmiaru kroku myszy? Czy możesz polecić książkę o Swing? – xmjx

+0

Ah, muszę dodać trochę więcej. Byłem ciekawy dlaczego setBlockIncrement (1) musi być wywołany za każdym razem, gdy wywoływany jest AdjustmentListener, więc dezaktywowałem detektor i wywołałem setBlockIncrement (1) w momencie tworzenia panelu przewijania. Ujrzeć! Działa to również z takim samym niepożądanym efektem ubocznym. Nie pamiętam, jaki był tego efekt w moim biurze, więc przetestuję to jutro w pracy. Czasami nie lubię Swinga. ;-) – xmjx

+0

@xmjx na swing, po prostu przeczytaj tutoriale dostarczone przez słońce/oracle. Nie czytałem książki poświęconej temu tematowi. Swing jest dość potężny, ale nie jest też najmniejszą platformą GUI. –

Powiązane problemy