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?
Odpowiedz
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.
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
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
@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. –
- 1. jQuery pionowe kółko myszy gładko przewijane
- 2. Tworzenie linię kółko w środku
- 3. JScrollPane - Przybliżenie względem pozycji myszy
- 4. Wykryj martwe przewijanie u dołu strony (kółko myszy, zdarzenia przewijania)
- 5. kółko myszy nie przewija się w tmux
- 6. Przyspieszenie kółka myszy w jScrollPane (jQuery)
- 7. Jak poziomo przewijać w WPF za pomocą kółka pochylania myszy?
- 8. Jak zrobić kółko wokół treści za pomocą CSS?
- 9. W jaki sposób mogę przekonwertować przeglądarkę przewijania w Windows 8 na kółko myszy?
- 10. Kółko wygląda na rozmyte
- 11. Jak nakładać kółko na mapie iOS
- 12. CSS - jak zrobić linię podziału div
- 13. jQuery - JScrollPane z AJAX: kółka myszy nie działa
- 14. Jak wyświetlić przycisk myszy na myszy div
- 15. Jak przewijać na górze strony w jonowym
- 16. Jak programowo przewijać TreeView?
- 17. Jak narysować linię na formularzu?
- 18. Jak zawsze można przewijać UIScrollView?
- 19. Zniszcz jScrollPane
- 20. Jak wyłączyć domyślne zachowanie malowania zdarzeń przewijania kół na JScrollPane
- 21. Przeciągnij i przesuń kółko rysowane na płótnie
- 22. Jak zrobić zdjęcie za pomocą wskaźnika myszy z jquery?
- 23. Jak automatycznie przewijać widok tabeli? (Swift)
- 24. jak zrobić nową linię w komórce jupyter wyprzedaży
- 25. jak narysować linię na obrazie?
- 26. blok przewijania jscrollpane rodzic
- 27. Jak przewijać przedmioty LI na stałej wysokości UL?
- 28. Jak zrobić kółko pojawiające się tylko w niektórych elementach div o różnych kolorach?
- 29. Obracanie obiektu do myszy na myszy myszką
- 30. Jak wykryć pochylenie kółka myszy?
@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
Zobacz camickr's [Sterownik kółka myszy] (http://tips4java.wordpress.com/2010/01/10/mouse-wheel-controller/) – aterai
@aterai hach .. Zapomniałem o tym :-) Zdecydowanie do zrobienia, zastanów się nad odpowiedzią na komentarz, aby zdobyć prawdziwe głosy. – kleopatra