gpt4 book ai didi

java - 如何根据 jSpinner 中超出最小/最大范围的文本字段的无效手动编辑来触发事件

转载 作者:太空宇宙 更新时间:2023-11-04 09:31:56 25 4
gpt4 key购买 nike

我有一个 java swing UI jSpinner 组件,它接受 double 值并设置了最小和最大允许范围。问题是,当用户在组件的 jFormattedTextField 部分手动输入超出最小/最大范围的值并且焦点离开文本字段时,该值会立即被拒绝并恢复为上一个有效值(这是组件的预期且正确的行为)。

用户请求更改行为,以便当输入无效值并且焦点离开文本字段时,而不是仅仅恢复到最后一个有效值,它应该恢复到最大或最小有效值,具体取决于用户输入的无效值是否大于允许的最大值或小于允许的最小值。

例如,如果微调器的最小/最大范围设置为 (1,10) 并且用户手动输入值 20,则文本字段应设置为 10,而不是 jSpinner 模型中存在的最后一个有效值。

我尝试了多种不同的方法来解决此问题,包括将 KeyListener 附加到底层 JFormattedTextField 以及将 PropertyChangeListener 附加到 Jspinner 的数字/默认编辑器,但似乎主要问题是我无法获取无效值的实际值,以便我可以确定它是否超出最大值或最小值的范围。

使用 KeyListener(我意识到这不是处理 JFormattedTextField 输入的适当方法)我至少能够捕获击键,但使用以下代码我最多能做的是捕获一个异常,它让我知道输入值超出了最小/最大范围,仅此而已。

在代码示例中,我收到的值是“dirtyValue”始终是最后一个有效值,而不是新输入的实际无效的用户输入。
我完全没有主意了。谁能帮忙提供一些见解吗?

我尝试过使用 KeyListener、propertyChangeListener 和 DocumentListener。

private JFormattedTextField tf = ((JSpinner.NumberEditor)
jSpinnerTiming.getEditor()).getTextField();

((JSpinner.DefaultEditor)jSpinnerTiming.getEditor()).getTextField().
addKeyListener(new KeyListener(){

@Override public void keyPressed(KeyEvent e) {

}

@Override public void keyReleased(KeyEvent e) {

}

@Override public void keyTyped(KeyEvent e) {
try { tf.commitEdit(); } catch
(ParseException e1) { // TODO Auto-generated catch block
e1.printStackTrace(); }
double dirtyValue = (double)tf.getValue();
double max = ALLOWABLE_MAX;
double min = ALLOWABLE_MIN;
if (dirtyValue > max) {
jSpinnerTiming.setValue(max);
; } else if(dirtyValue < min){
jSpinnerTiming.setValue(min);
} }

});

最佳答案

这是我能够使用 FocusListener 实现的解决方案,尽管我不确定它有多正确。

private JFormattedTextField tf = ((JSpinner.DefaultEditor) jSpinnerTiming.getEditor()).getTextField();
((JSpinner.DefaultEditor)jSpinnerTiming.getEditor()).getTextField().addFocusListener(new FocusListener() {

@Override
public void focusLost(FocusEvent e) {
// The unchecked user input value
double dirtyValue = Double.parseDouble(tf.getText());

// Get Minimum and Maximum values from jSpinner's Model
double max = (Double) ((SpinnerNumberModel) jSpinnerTiming.getModel()).getMaximum();//MAX_ALLOWED_RATE
double min = (Double) ((SpinnerNumberModel) jSpinnerTiming.getModel()).getMinimum();//LOWEST_ALLOWABLE_RATE;

if (dirtyValue > max) {
jSpinnerTiming.setValue(max);
} else if(dirtyValue < min){
jSpinnerTiming.setValue(min);
}
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
});

关于java - 如何根据 jSpinner 中超出最小/最大范围的文本字段的无效手动编辑来触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57010679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com