2011-12-26 26 views
5

Tôi đang cố thiết lập JSpinner bằng SpinnerNumberModel với giá trị = 0.0005, min = 0.0, max = 1.0 và kích thước bước = 0.0005. Tuy nhiên, khi tôi tạo ra một spinner với các thông số này tôi quan sát hành vi rất lạ. Thay vì bắt đầu ở mức 0,0005 và tăng 0,0005 với mỗi lần nhấp vào mũi tên lên, giá trị có vẻ như ở mức 0,Odd SpinnerNumberModel hành vi trong Java

Để đảm bảo đây không chỉ là vấn đề về định dạng, tôi đã in giá trị của spinner sau mỗi sự kiện thay đổi. Chắc chắn, đối với mỗi nhấp chuột của mũi tên lên, bảng điều khiển hiển thị giá trị là 0 và sau đó là 0,0005, bất kể số lần spinner đã được nhấp.

Dưới đây là mã tôi đã sử dụng để kiểm tra điều này, bao gồm một spinner với các giá trị hơi khác nhau chỉ hoạt động tốt cho mục đích so sánh.

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

public class Main { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(200, 80); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     final JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(0.0005, 0.0, 1.0, 0.0005)); 
     final JSpinner spinner2 = new JSpinner(new SpinnerNumberModel(0.05, 0.0, 1.0, 0.05)); 
     panel.add(spinner1, BorderLayout.NORTH); 
     panel.add(spinner2, BorderLayout.SOUTH); 
     frame.add(panel); 
     spinner1.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("spinner1: " + ((Number) spinner1.getValue()).doubleValue()); 
      } 
     }); 
     spinner2.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("spinner2: " + ((Number) spinner2.getValue()).doubleValue()); 
      } 
     }); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

} 

Bất cứ ai có thể giải thích cho tôi tại sao spinner2 hoạt động như dự định, nhưng spinner1 thì không?

Cảm ơn.

Chỉnh sửa: Cảm ơn Peter vì đã chỉ ra rằng định dạng của trường văn bản của spinner thực sự có ảnh hưởng đến giá trị được lưu trữ. Để máy quay đầu tiên hoạt động như dự định, tôi đã thêm dòng: spinner1.setEditor(new JSpinner.NumberEditor(spinner1, "0.0000"));.

+0

Cảm ơn cho đầu vào. Dự án thực tế mà tôi gặp vấn đề lần đầu tiên phức tạp hơn nhiều so với dự án này. Mã tôi đăng ở đây là một ví dụ về xương rất trần thể hiện vấn đề. –

+0

Được rồi, tôi đã chỉnh sửa ví dụ để bao gồm một JPanel để giữ hai người quay. Thật không may, tôi vẫn nhận được kết quả tương tự như vậy cho người quay đầu tiên. –

+0

Tôi đã sử dụng một JPanel và vấn đề vẫn còn. Tôi đã thử sử dụng (0,001, 0,0001) làm mô hình của JSpinner (giá trị, bước) và (0,0001, 0,001). Không hoạt động. Nhưng (0,001, 0,001) hoạt động thay thế. Điều này có ngụ ý vấn đề trình bày chính xác JSpinner không? – xorange

Trả lời

9

vấn đề là điều này trong JFormattedTextField được sử dụng bởi spinner. Trong biên tập mà bạn có thể tìm thấy:

public void commitEdit() throws ParseException { 
    AbstractFormatter format = getFormatter(); 

    if (format != null) { 
     setValue(format.stringToValue(getText()), false, true); 
    } 
} 

hiển thị spinner của bạn 0,0005 như 0.0, nếu bạn tăng nó lần đầu tiên đặt 0.0 trong mô hình của bạn và sau đó tăng đến 0,0005, bạn sự kiện thực sự nắm bắt nó nhưng textfield của bạn chỉ nhìn thấy 0.0

vì vậy giải pháp sẽ thay đổi định dạng của trường văn bản spinner.

bạn có thể overide trình biên tập

final JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(0.0005, 0.0, 1.0, 0.0005)) { 
     @Override 
     protected JComponent createEditor(SpinnerModel model) 
     { 
     return new NumberEditor(this, "0.0000");//needed decimal format 
     } 
    }; 
+0

Thú vị ... Tôi giả định rằng spinner giữ nguyên giá trị chính xác gấp đôi bất kể nó được định dạng bởi trường văn bản như thế nào. Cảm ơn! –

+0

Cảm ơn Peter. Tôi đã chỉnh sửa câu hỏi của mình để bao gồm một dòng bổ sung phục vụ mục đích tương tự. –

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