当 JSpinner 失去焦点时用户输入无效值时如何“注意/陷阱”

2023-12-19

这是 SSCCE 对我之前问题的延续:

上一个问题 https://stackoverflow.com/questions/20902932/how-to-check-manual-edits-on-a-jspinner-field-using-defaulteditor-approach

当用户输入无效值时,该 JSpinner 背景将变为红色,而当用户输入有效值时,该背景将变为白色。但是,如果值无效并且用户单击远离此字段的值,则该值将恢复为之前的值。

我想在发生这种情况时注意到/陷阱,并通知用户他键入的值未被使用,并禁用依赖于该值的任何其他功能。

我如何修改以下代码来实现这一目标?

public static void main(String[] args) {
    // TODO Auto-generated method stub

    JFrame F = new JFrame();
    F.setVisible(true);
    JPanel p = new JPanel();


    final JSpinner spin2 = new JSpinner();
    spin2.setModel(new SpinnerNumberModel(10, 10, 100, 1));

    JComponent comp = spin2.getEditor();
    JFormattedTextField field = (JFormattedTextField) comp.getComponent(0);
    DefaultFormatter formatter = (DefaultFormatter) field.getFormatter();
    formatter.setCommitsOnValidEdit(true);


        ((JSpinner.DefaultEditor)Position.getEditor()).getTextField().addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                //LOG.info("" + evt);
                if ("editValid".equals(evt.getPropertyName())) {
                    if (Boolean.FALSE.equals(evt.getNewValue())) {
                        SpinnerNumberModel model = (SpinnerNumberModel) Position.getModel();  

                        ((JSpinner.DefaultEditor)Position.getEditor()).getTextField().setBackground(Color.RED);
                        ((JSpinner.DefaultEditor)Position.getEditor()).getTextField().setToolTipText("Amount must be in range [ " + model.getMinimum() + " ... " + model.getMaximum() + " ] for this symbol");

                    }
                    else{
                        ((JSpinner.DefaultEditor)Position.getEditor()).getTextField().setBackground(Color.WHITE);
                    }
                }

            }
        });


    p.add(spin2);   


    F.add(p);
    F.pack();
    F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}

如果您需要用户的输入持续存在,即使他/她输入了错误的输入,则将焦点丢失行为设置为PERSIST.

如果您需要通知用户无效值typed然后添加一个KeyListener到微调器的文本字段。那KeyListener将会通知commitEdit()如果用户的输入无效,则会失败,抛出一个已检查的异常,您将捕获该异常并通知用户。

如果您需要通知用户无效值当焦点失去时然后添加一个FocusListener到微调器的文本字段。那FocusListener将会通知commitEdit()如果用户的输入无效,则会失败,抛出一个已检查的异常,您将捕获该异常并通知用户。

把它们放在一起:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.ParseException;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JSpinner.DefaultEditor;
import javax.swing.SpinnerNumberModel;

public class Main {
    public static void warn(final JSpinner spin) {
        final JFormattedTextField jftf = ((DefaultEditor) spin.getEditor()).getTextField();
        try {
            spin.commitEdit(); //Try to commit given value.
            jftf.setBackground(Color.WHITE); //If successfull the revert back to white background.
        }
        catch (final ParseException px) {
            if (!jftf.getBackground().equals(Color.RED)) { //Guard.
                jftf.setBackground(Color.RED); //Error value given.

                //Inform user:
                Toolkit.getDefaultToolkit().beep();
                JOptionPane.showMessageDialog(spin, "Invalid value given in spinner!");
            }
            //else if the background is already red, means we already checked previously,
            //so we do not inform the user again. We inform him only once.
        }
    }

    public static void main(final String[] args) {
        final JSpinner spin = new JSpinner(new SpinnerNumberModel());
        spin.setPreferredSize(new Dimension(150, 30));
        spin.addChangeListener(e -> warn(spin)); //Needed for reverting back to white if the user enters valid input.

        final JFormattedTextField jftf = ((DefaultEditor) spin.getEditor()).getTextField();
        jftf.setFocusLostBehavior(JFormattedTextField.PERSIST);
        jftf.addKeyListener(new KeyAdapter() {
            //Needed to inform user if they type something wrong:
            @Override public void keyReleased(final KeyEvent kevt) { warn(spin); }
        });
        jftf.addFocusListener(new FocusAdapter() {
            //Needed to inform user if the text field loses focus and has a wrong value:
            @Override public void focusLost(final FocusEvent fevt) { warn(spin); }
        });

        final JPanel contents = new JPanel(); //FlowLayout.
        contents.add(new JLabel("Spinning values:", JLabel.CENTER));
        contents.add(spin);

        final JFrame frame = new JFrame("JSpinner mouse");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(contents);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 JSpinner 失去焦点时用户输入无效值时如何“注意/陷阱” 的相关文章

随机推荐

  • 如何将合并标签用于RelativeLayout root?

    我有一个扩展的自定义视图RelativeLayout并在 xml 文件中定义其内容 有RelativeLayout作为其根 我怎样才能避免有两个RelativeLayouts在我的自定义布局膨胀之后 我尝试使用merge标记作为我在 xml
  • 强制 window.open() 在 chrome 中创建新选项卡

    我使用 window open 来填充具有不同内容的新窗口 主要是来自自动化流程的报告和存储的 HTML 我注意到 Chrome 在 window open 方面有一些非常不一致的行为 我的一些调用将创建一个新选项卡 首选行为 一些调用会导
  • 导出到 Excel 时 SSRS 报告颜色发生变化

    当我们将 SSRS 2008 报告导出到 Excel 然后将某个范围从该文件复制到另一个 Excel 文件时 报告中使用的颜色会更改为完全不同的颜色 当我们使用 条件格式 为某些数据着色时 这非常烦人 这些细胞具有特定的颜色 有什么想法吗
  • 包括与 Ant 一起使用的 Google AdMob SDK

    我正在使用 新的 AdMob SDK 按照以下说明进行操作这个谷歌网站 http code google com mobile ads docs android fundamentals html 我们应该整合GoogleAdMobAdsS
  • 更改 iPhone SDK 中的徽章和推送通知

    我尝试过推送通知教程 http mobiforge com developing story programming apple push notification services 它工作正常 但问题是徽章 当我单击视图时 会出现应用程序
  • 如何在 salesforce 中刷新 OAuth 2.0 中的 access_token

    我正在开发一个 salesforce 应用程序并使用 OAuth 2 0 登录 我有一个刷新令牌 如何通过 OAuth 2 0 向 salesforce 发送包含特定用户刷新令牌的请求来获取新的 access token 取自 在 Forc
  • Python 字节连接

    我想将字节字符串的第一个字节连接到字符串的末尾 a b x14 xf6 a a 0 我收到错误 Traceback most recent call last File
  • Crystal Reports 中按两个字段分组

    如何在水晶报表中按两个不同的字段进行分组 敌人的例子 val1 val2 val3 val6 val1 val12 val3 val7 val11 val2 val3 val8 val11 val12 val3 val9 我希望报告看起来像
  • HTML 选择框(下拉菜单)的高度

    有人可以确认它吗not可以更改单击选择框时显示的下拉列表的高度 select 的 size 属性使它看起来像一个列表 CSS 中的 height 属性也没有多大用处 确认的 下拉的部分设置为 显示所有条目所需的高度 或 The height
  • 如何在plsql中的过程体内创建游标

    我要创建光标动态地位于过程体内我也必须使用for loop而不是下面的代码 我做了动态游标 但无法使用 for 循环 PROCEDURE myprocedure AS LV TEST CUR SYS REFCURSOR LV QUERY V
  • 如何使用 SymPy 和 LaTeX 显示百分比字符

    我一直在使用 Sympy 来研究电力系统的方程 并且已经进行了很多处理 以便方程看起来不错且体面 所有值都包含遵循它们的单位 甚至通过方程组合也是如此 我认为这非常重要 因为目标是我正在编写的用于计算我的值的文档是我将呈现的最终文档 我正在
  • Scala (2.8) 清单如何工作?

    我有一些 Scala 代码大量使用了泛型 并且我从文档中了解到 在参数化约束中使用清单可以帮助我解决类型擦除问题 例如 我想实例化泛型类型的新对象 只是 我想更多地了解它是如何工作的 它几乎感觉就像某种哈希图 为每个调用站点获取一个条目 这
  • 我可以使用 mono 的 AOT 功能来本机“预编译”.NET DLL/EXE,以使它们更难进行逆向工程吗?

    我可以使用 mono 的 AOT 提前编译 功能来本机 预编译 我自己的一些 NET DLL 和 或 EXE 的全部或部分 以使它们更难以进行逆向工程吗 我正在使用 Windows 7 x64 但我也有 x86 XP 机器 和 NET 3
  • 使用 ASP.NET MVC 设置路由 {tenant}/{controller}/{action}/{id}?

    我想设置一个多租户 ASP NET MVC 应用程序 理想情况下 这个应用程序应该有一条路线 tenant controller action id each tenant代表应用程序的逻辑实例 简单地独立的多用户帐户 我仍然不清楚具体的细
  • Vuetify / DataTable:更改“显示分组依据”按钮的样式?

    我想使用 vuetify 数据表中的默认分组功能 它工作正常 但我想更改分组的默认按钮样式并将其替换为图标 那可能吗 如果我检查开发工具中的按钮 它只会显示 span group span 在文档中只找到这个 https vuetifyjs
  • 使用 FIRST_VALUE 而不在分组依据中包含内部列

    我正在使用一个看起来像这样的表 userID eventDate eventName 1 2019 01 01 buySoup 2 2019 01 01 buyEggs 2 2019 01 03 buyMilk 2 2019 01 04 b
  • 如何使用 rstanarm 以 APA 风格报告贝叶斯线性(混合)模型?

    我目前正在努力解决如何按照 APA 6 建议报告输出的问题rstanarm stan lmer 首先 我将在频率论方法中拟合混合模型 然后尝试使用贝叶斯框架执行相同的操作 这是获取数据的可重现代码 library tidyverse lib
  • 如何添加Voronoi图?

    我想向我的集群添加 Voronoi 图 也就是说 我想要一张包含我的簇 质心 Voronoi 区域的图 有简单的方法吗 I tried x lt c 4 7 9 2 3 3 7 7 8 8 9 9 y lt c 6 3 3 6 5 7 2
  • Symfony2 从表中删除记录

    我的树枝上有一个按钮 我希望能够使用它从表中删除记录 当我点击删除按钮时 页面会重新加载 但不会删除任何记录 这是我的树枝 h1 Admin Area The football blog h1 table class zebra thead
  • 当 JSpinner 失去焦点时用户输入无效值时如何“注意/陷阱”

    这是 SSCCE 对我之前问题的延续 上一个问题 https stackoverflow com questions 20902932 how to check manual edits on a jspinner field using