【问题标题】:How to read the time from JSpinner using the Event ChangeListener() and Print it on the Console?如何使用 Event ChangeListener() 从 JSpinner 读取时间并在控制台上打印?
【发布时间】:2020-09-27 04:34:18
【问题描述】:

我需要帮助来使用事件 ChangeListener 从 JSpinner 读取时间。 问题是我一步旋转时会打印两次时间。 当我在主程序中运行以下代码时,输​​出是 00:00, 01:00 单次启动。 你能帮我知道原因,以及当我向上或向下旋转时如何修复它只打印一个值?谢谢..参见示例

public class SpinnerTest {

private JFrame frame;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                SpinnerTest window = new SpinnerTest();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public SpinnerTest() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    JPanel groupLayoutPanel = new JPanel();

    JSpinner spinner = new JSpinner(new SpinnerDateModel(new Date(1591563600775L), null, null, Calendar.HOUR_OF_DAY));
    spinner.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent e) {
            JSpinner spinner = (JSpinner)e.getSource();
            Date sdate= (Date)spinner.getValue();
            String pattern = "HH:mm";
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
            String date = simpleDateFormat.format(sdate);
            System.out.println(date);

        }
    });
    JSpinner.DateEditor de= new JSpinner.DateEditor(spinner,"HH:mm");
    spinner.setEditor(de);

    GroupLayout grouplayout= new GroupLayout(groupLayoutPanel);
    grouplayout.setHorizontalGroup(
        grouplayout.createParallelGroup(Alignment.LEADING)
            .addGroup(grouplayout.createSequentialGroup()
                .addGap(83)
                .addComponent(spinner, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                .addContainerGap(321, Short.MAX_VALUE))
    );
    grouplayout.setVerticalGroup(
        grouplayout.createParallelGroup(Alignment.LEADING)
            .addGroup(grouplayout.createSequentialGroup()
                .addGap(25)
                .addComponent(spinner, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                .addContainerGap(216, Short.MAX_VALUE))
    );
    groupLayoutPanel.setLayout(grouplayout);
    frame = new JFrame();
    frame.setContentPane(groupLayoutPanel);
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

【问题讨论】:

标签: java swing jspinner


【解决方案1】:

你能帮我知道原因以及如何解决它在我旋转时只打印一个值

您需要检查状态监听器的getValueIsAdjusting() 属性以确定调整是否完成。

阅读 How to Write a ChangeListener 上的 Swing 教程部分,了解更多信息和示例。

编辑:

double 事件仅在第一次单击微调器按钮时生成。

这是一个似乎可行的解决方法。我在添加 ChangeListener 之前设置了编辑器并提交了编辑器:

JSpinner spinner = new JSpinner(new SpinnerDateModel(new Date(1591563600775L), null, null, Calendar.HOUR_OF_DAY));
JSpinner.DateEditor de= new JSpinner.DateEditor(spinner,"HH:mm");
spinner.setEditor(de);

try
{
    spinner.commitEdit();
}
catch(Exception e) {}

spinner.addChangeListener(…);

【讨论】:

  • getValueIsAdjusting() 使用的是 JSlider 而不是 JSpinner
  • 根据我试图找出 JSpinner 为何如此行事的原因,我发现了一个有趣的事实。如果您尝试将 JSpinner 值设置到另一个组件(如 JLable 或 JtextFiled)中,则该值将在每次向上或向下旋转时打印为一个值,但如果您尝试在控制台上使用 System.out.println 打印它,每次旋转将打印两次或向下...
  • getValueIsAdjusting() 正在使用 JSlider 而不是 JSpinner - 好点。 ...像 JLable 或 JtextFiled 一样,该值将被打印为一个值 - 这是因为 setText() 方法执行得如此之快,以至于您只能看到显示的最后一个值。
  • 那么消息在控制台上显示两次的背后有什么原因吗?
  • 谁能向我解释 setCommitsOnValidEdit 对 DefaultFormatter 有什么好处?
【解决方案2】:

第一次更改JSpinner 的值时,会触发两个更改事件。

第一个更改事件是因为模型的初始值被设置为编辑器的值。这就是为什么打印的第一个值是模型的初始值。

第二个更改事件被触发,因为值由于用户操作而更改。因此,打印的第二个值是用户更改产生的新值。

这就是 camickr 中的answer 起作用的原因。在将ChangeListener 添加到JSpinner 之前,他通过调用方法commitEdit() 来强制触发第一个更改事件。因此,当用户第一次更改微调器值时,只会触发第二次更改事件。

如果在调用方法commitEdit()之前添加ChangeListener,那么当第一次显示GUI时,您将看到在实际与JSpinner交互之前打印的初始值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多