2012-09-24 30 views
8

Tôi đã gặp một số sự cố khi sử dụng lớp JSlider - cụ thể là với các nhãn đánh dấu.Đây có phải là lỗi trong JSlider không?

Lần đầu tiên tôi sử dụng setMajorTickSpacingsetMinorTickSpacing mọi thứ hoạt động như mong đợi. Tuy nhiên, các cuộc gọi tiếp theo đến số setMajorTickSpacing sẽ cập nhật các dấu tích, nhưng không cập nhật nhãn. Tôi đã viết một ví dụ đơn giản để chứng minh hành vi này:

import java.awt.event.*; 
import javax.swing.*; 

public class SliderTest { 
    public static void main(String args[]) { 
     JFrame frame = new JFrame(); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent we) { 
       System.exit(0); 
      } 
     }); 
     frame.setSize(300, 250); 

     JSlider slider = new JSlider(0, 100, 0); 
     slider.setMajorTickSpacing(10); 
     slider.setMinorTickSpacing(1); 
     slider.setPaintLabels(true); 
     slider.setPaintTicks(true); 

     slider.setMajorTickSpacing(25); 
     slider.setMinorTickSpacing(5); 

     frame.add(slider); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

Hai đơn giản công việc ở quanh dường như giải quyết vấn đề - hoặc sử dụng slider.setLabelTable(null) hoặc slider.setLabelTable(slider.createStandardLabels(25)) trước khi cuộc gọi thứ hai để setMajorTickSpacing. Do đó, có vẻ như bảng nhãn không được cập nhật chính xác.

Tôi không chắc chắn đây có phải là hành vi dự định hay không. Bản năng đầu tiên của tôi là việc cập nhật khoảng cách đánh dấu cũng nên cập nhật các nhãn, nhưng cũng có các đối số để tách cả hai.

Vì vậy, tôi muốn biết nó là gì - đây có phải là lỗi trong JSlider hoặc hành vi dự định không? Nếu nó hành vi dự định, thì lý do nổi bật để đưa ra lựa chọn đó là gì?

+0

trông giống như một lỗi đối với tôi - bắt tốt :-) – kleopatra

+2

Cảm ơn bạn đã chia sẻ về sự kiện sắp tới này. –

Trả lời

5

Bạn có thể dễ dàng nhận thấy nguyên nhân của vấn đề này bằng cách nhìn vào mã setMajorTickSpacing nguồn:

public void setMajorTickSpacing(int n) { 
    int oldValue = majorTickSpacing; 
    majorTickSpacing = n; 
    if (labelTable == null && getMajorTickSpacing() > 0 && getPaintLabels()) { 
     setLabelTable(createStandardLabels(getMajorTickSpacing())); 
    } 
    firePropertyChange("majorTickSpacing", oldValue, majorTickSpacing); 
    if (majorTickSpacing != oldValue && getPaintTicks()) { 
     repaint(); 
    } 
} 

Nếu bạn gọi phương pháp này hai lần - labelTable giá trị sẽ không được null nữa và nó sẽ không được cập nhật. Nó có thể là một hành vi có ý định theo bình phương của:

* This method will also set up a label table for you. 
* If there is not already a label table, and the major tick spacing is 
* {@code > 0}, and {@code getPaintLabels} returns 
* {@code true}, a standard label table will be generated (by calling 
* {@code createStandardLabels}) with labels at the major tick marks. 

Vì vậy, bạn phải cập nhật nhãn bằng tay mỗi khi bạn muốn họ được cập nhật (trừ khi bạn ghi đè phương pháp này với riêng bạn mà không được cập nhật).

+0

Cảm ơn, tôi đã đi đến kết luận tương tự khi tôi nhìn vào nguồn. Tôi vẫn cho rằng tài liệu có thể tốt hơn. – charlemagne

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