2009-02-05 40 views
13

Bất cứ khi nào tôi bấm vào một JSlider nó được định vị một majorTick theo hướng nhấp chuột thay vì nhảy đến chỗ tôi thực sự nhấp vào. (Nếu thanh trượt ở điểm 47 và tôi bấm 5 nó sẽ nhảy tới 37 thay vì 5). Có cách nào để thay đổi điều này trong khi sử dụng JSliders, hoặc tôi phải sử dụng một datastructure?Câu hỏi JSlider: Vị trí sau khi nhấp chuột trái

Trả lời

16

Như kỳ lạ như điều này có vẻ, nó thực sự là Look and Feel kiểm soát hành vi này. Hãy xem BasicSliderUI, phương pháp bạn cần ghi đè là scrollDueToClickInTrack(int).

Để đặt giá trị của JSlider thành giá trị gần nhất cho nơi người dùng nhấp vào bản nhạc, bạn cần thực hiện một số dịch chuyển ưa thích giữa các tọa độ chuột từ getMousePosition() đến giá trị bản nhạc hợp lệ. chiếm vị trí của Component, đó là hướng, kích thước và khoảng cách giữa các dấu tích vv. May mắn thay, BasicSliderUI cho chúng ta hai chức năng tiện dụng để làm điều này: valueForXPosition(int xPos)valueForYPosition(int yPos):

JSlider slider = new JSlider(JSlider.HORIZONTAL); 
slider.setUI(new MetalSliderUI() { 
    protected void scrollDueToClickInTrack(int direction) { 
     // this is the default behaviour, let's comment that out 
     //scrollByBlock(direction); 

     int value = slider.getValue(); 

     if (slider.getOrientation() == JSlider.HORIZONTAL) { 
      value = this.valueForXPosition(slider.getMousePosition().x); 
     } else if (slider.getOrientation() == JSlider.VERTICAL) { 
      value = this.valueForYPosition(slider.getMousePosition().y); 
     } 
     slider.setValue(value); 
    } 
}); 
+0

Đó là loại kỳ lạ, bắt mắt. Đang cố gắng tìm ra cách đầu vào cho scrollDue .. (int) được tạo ra. Đối với hướng được xác định phải có một số kiểm tra nơi tôi nhấp vào trượt trượt so sánh. Đối với điều đó để được xác định sẽ không một số phương pháp cần biết chính xác nơi trên thanh trượt tôi bấm? –

+0

không thực sự, hướng là dễ dàng - cho một theo dõi ngang nó chỉ cần biết rằng x phối hợp của nhấp chuột là ít hơn hoặc lớn hơn x phối hợp của thanh trượt xử lý. – ninesided

+0

Vâng, nhưng để biết nếu nó nhỏ hơn hoặc lớn hơn tọa độ X, bạn sẽ không cần biết vị trí trên thanh trượt bạn nhấp để so sánh? Nếu điều khiển thanh trượt ở mức 50, bạn cần phải biết vị trí bạn nhấp để xem vị trí đó là> hoặc <50, không? –

0

Hành vi này có nguồn gốc từ hệ điều hành. Bạn có chắc chắn muốn xác định lại và gây nhầm lẫn cho người dùng không? Tôi không nghĩ vậy. ;)

4

Câu hỏi này là loại cũ, nhưng tôi chỉ chạy qua vấn đề này bản thân mình. Đây là giải pháp của tôi:

JSlider slider = new JSlider(/* your options here if desired */) { 
    { 
     MouseListener[] listeners = getMouseListeners(); 
     for (MouseListener l : listeners) 
      removeMouseListener(l); // remove UI-installed TrackListener 
     final BasicSliderUI ui = (BasicSliderUI) getUI(); 
     BasicSliderUI.TrackListener tl = ui.new TrackListener() { 
      // this is where we jump to absolute value of click 
      @Override public void mouseClicked(MouseEvent e) { 
       Point p = e.getPoint(); 
       int value = ui.valueForXPosition(p.x); 

       setValue(value); 
      } 
      // disable check that will invoke scrollDueToClickInTrack 
      @Override public boolean shouldScroll(int dir) { 
       return false; 
      } 
     }; 
     addMouseListener(tl); 
    } 
}; 
+0

không phải giải pháp này có nghĩa là bạn không còn có thể sử dụng bánh xe cuộn để di chuyển thanh trượt không? – ninesided

+0

+1, tôi đã thực hiện một thay đổi nhỏ để xóa và thêm MouseMotionListener. Điều này tạo ra một sự thay đổi nhỏ về mỹ phẩm ở chỗ con chuột sẽ vẫn ở giữa trong ngón cái trượt khi bạn kéo ngón tay cái thay vì nhảy sang cạnh trái của ngón cái. – camickr

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