2012-07-09 33 views
5

Tôi có một JScrollPane có khung nội dung là một JXList. Khi tôi sử dụng bánh xe chuột trên danh sách, danh sách sẽ thực hiện ba (3) mục mỗi lần. Điều này cũng làm việc cho một bảng, bất kể chiều cao hàng. Làm thế nào tôi có thể thay đổi điều này để - bất kể nền tảng - cho cả danh sách và bảng khoảng cách di chuyển chính xác là 1 mục? Thiết lập tăng khối không cắt nó bởi vì một số hàng trong bảng có chiều cao khác nhau.Làm thế nào để làm cho JScrollPane cuộn 1 dòng cho mỗi bước bánh xe chuột?

+0

@trashgod đã không tìm kiếm trong một thời gian - bánh xe thực sự có vẻ bản đồ để các đơn vịKhả năng nào đó, và không xử lý chiều cao hàng cá nhân, do đó, đã sai với sự nghi ngờ của tôi. Tinh chỉnh việc triển khai có thể cuộn có thể giúp, sau khi tất cả :-) – kleopatra

+2

Xem Camickr [Chuột điều khiển bánh xe] (http://tips4java.wordpress.com/2010/01/10/mouse-wheel-controller/) – aterai

+0

@aterai hach ​​.. quên rằng một :-) Chắc chắn là con đường để đi, hãy xem xét làm cho bình luận của bạn một câu trả lời, để lấy một số phiếu thực sự. – kleopatra

Trả lời

7

Ra quan tâm tinh khiết (và một chút chán nản) Tôi tạo ra một ví dụ làm việc:

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

Sự kỳ diệu thực được thực hiện trong tùy chỉnh AdjustmentListener, nơi chúng tôi đi và tăng hiện nay "di chuyển vị trí" bởi một khối duy nhất mỗi lần. Điều này hoạt động lên và xuống và với các kích thước hàng khác nhau, như được hiển thị trong ví dụ.


Như @kleopatra đề cập trong các ý kiến, bạn cũng có thể sử dụng một MouseWheelListener chỉ xác định lại hành vi của chuột bánh.

Xem hướng dẫn chính thức here.

+0

Điều này khá tuyệt vời. Cảm ơn rất nhiều! Tôi có nghĩa là, chắc chắn, có/có thể/là một .setScrollIncrement (int i) một nơi nào đó, nhưng cách này nó hoạt động, quá. Chỉ cần một đoạn ngắn sang một bên: Mã này làm cho tính năng trang của thanh cuộn (nhấp vào thanh bên ngoài tay cầm), cuộn các bước em bé, mà không phải là siêu lạ xem xét mã của bạn đặt khối tăng lên 1 "trên toàn cầu". Có cách nào để thay đổi kích thước bước bánh xe chuột không? Ngoài ra, bạn có thể giới thiệu một cuốn sách về Swing không? – xmjx

+0

Ah, phải bình luận thêm một chút. Tôi đã tò mò tại sao setBlockIncrement (1) phải được gọi mỗi khi AdjustmentListener được gọi, vì vậy tôi đã vô hiệu hóa trình nghe và gọi setBlockIncrement (1) một lần tại thời điểm tạo cửa sổ cuộn. Kìa! Điều này cũng hoạt động với cùng tác dụng phụ không mong muốn. Tôi không thể nhớ được hiệu ứng này là gì ở máy văn phòng của tôi nên tôi sẽ kiểm tra điều này vào ngày mai. Đôi khi tôi không thích Swing. ;-) – xmjx

+0

@xmjx cho swing, chỉ cần đọc các hướng dẫn được cung cấp bởi mặt trời/oracle. Tôi đã không đọc một cuốn sách dành riêng cho điều đó. Swing là khá mạnh mẽ, nhưng nó cũng không phải là khuôn khổ GUI nhỏ nhất. –

Các vấn đề liên quan