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?
risposta
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.
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
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
@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. –
- 1. Velocizza la rotellina del mouse in jScrollPane (jQuery)
- 2. jQuery - jScrollPane con AJAX: la rotellina del mouse non funziona
- 3. Come rilevare l'inclinazione della rotellina del mouse?
- 4. Come posso scorrere il pannello usando la rotellina del mouse?
- 5. Come rotellina del mouse scorrere verso il basso con tmux
- 6. Come rendere un incremento/decremento DateTimePicker sulla rotellina del mouse
- 7. JScrollPane - Zoom relativo alla posizione del mouse
- 8. personalizzazione del plugin per rotellina del mouse jQuery
- 9. Come utilizzare il trackpad per la rotellina del mouse orizzontale per scorrere in un ScrollPane AWT Java
- 10. Valore delta della rotellina del mouse sempre 120
- 11. Mouse Accoppiamento della rotellina del mouse per ingrandire WPF e MVVM
- 12. Evento della rotellina del mouse nei browser moderni
- 13. Posizionare una rotellina del mouse nel rapportatore
- 14. L'oscillazione non attiverà mouseEntered/mouseExited correttamente dopo gli eventi della rotellina del mouse?
- 15. Scorrere attraverso un `wx.ScrolledPanel` con la rotellina del mouse e i tasti freccia
- 16. Evento della rotellina del mouse per funzionare con il controllo a distanza
- 17. Rotellina del mouse che invia il messaggio al controllo errato
- 18. Quanti pixel vengono fatti scorrere su un sito Web con un evento rotellina del mouse?
- 19. C#: come impedire lo scorrimento della rotellina del mouse nella mia casella combinata?
- 20. Come disattivare la rotellina del mouse Fare clic sul pulsante?
- 21. event.preventDefault(); non fermando la rotellina del mouse in Firefox
- 22. evento di mouseleave non si attiva sulla rotellina del mouse scorrere in IE11
- 23. Vimeo iFrame Rubare rotellina del mouse Event su Firefox
- 24. La rotellina del mouse scorre nel pannello con i controlli della casella immagine aggiunti dinamicamente?
- 25. Come catturare la rotellina del mouse sul pannello?
- 26. Come chiamare una funzione quando l'utente usa la rotellina del mouse per scorrere su/giù in javascript
- 27. La rotellina del mouse non funziona (mCustomScrollbar plugin jQuery)
- 28. Rendere automatico un JScrollPane verso il basso
- 29. Effetto di attenuazione scorrevole con rotellina del mouse
- 30. Jquery, annullando l'evento della rotellina del mouse, quindi riavvolgendolo dopo che le azioni sono state completate?
@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
Vedere il [Controller rotellina del mouse] di camickr (http://tips4java.wordpress.com/2010/01/10/mouse-wheel-controller/) – aterai
@aterai hach .. Dimenticavo quello :-) Sicuramente la strada da percorrere, considera di fare del tuo commento una risposta, per prendere dei veri voti. – kleopatra