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"));
.
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 đề. –
Đượ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. –
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