当前位置: 首页 > 面试题库 >

使JSpinner只读取数字但也可以检测退格

陈朗
2023-03-14
问题内容

我正在尝试制作一个仅接受数字的JSpinner,但我也希望它读取/响应退格键。

public class test {
    JFrame frame;
    JPanel panel;
    JSpinner spinner;

    public test()
    {
        frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(200,200));

        panel = new JPanel();

        SpinnerNumberModel numSpin = new SpinnerNumberModel(10, 0,1000,1);
        spinner = new JSpinner(numSpin);
        JFormattedTextField txt = ((JSpinner.NumberEditor) spinner.getEditor()).getTextField();
        ((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false);
        panel.add(spinner);

        frame.setContentPane(panel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

    }
    public static void main(String[] args)

    {
        test test = new test();
    }
}

上面的代码仅能产生数字,但这不允许我退格。我在此站点上找到了一些示例,但它们是为C编写的。


问题答案:
  • JFormattedTextField正确的实现不正确JSpinner,您有实现DocumentFilter用于过滤从keyboad Chars输入或从ClipBoard粘贴的un_wanted的工具,(感谢@StanislavL)

  • 你有自己的问题与解决selectAll()focusGained()包裹成invokeLater()

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.text.*;

public class TestDigitsOnlySpinner {

    public static void main(String... args) {
        SwingUtilities.invokeLater((Runnable) new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame("enter digit");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JSpinner jspinner = makeDigitsOnlySpinnerUsingDocumentFilter();
                frame.getContentPane().add(jspinner, BorderLayout.CENTER);
                frame.getContentPane().add(new JButton("just another widget"), BorderLayout.SOUTH);
                frame.pack();
                frame.setVisible(true);
            }

            private JSpinner makeDigitsOnlySpinner_BasicAttempt() {
                JSpinner spinner = new JSpinner(new SpinnerNumberModel());
                return spinner;
            }

            private JSpinner makeDigitsOnlySpinnerUsingDocumentFilter() {
                JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1));
                JSpinner.NumberEditor jsEditor = (JSpinner.NumberEditor) spinner.getEditor();
                final Document jsDoc = jsEditor.getTextField().getDocument();
                if (jsDoc instanceof PlainDocument) {
                    AbstractDocument doc = new PlainDocument() {

                        private static final long serialVersionUID = 1L;

                        @Override
                        public void setDocumentFilter(DocumentFilter filter) {
                            if (filter instanceof MyDocumentFilter) {
                                super.setDocumentFilter(filter);
                            }
                        }
                    };
                    doc.setDocumentFilter(new MyDocumentFilter());
                    jsEditor.getTextField().setDocument(doc);
                }
                return spinner;
            }
        });
    }

    private static class MyDocumentFilter extends DocumentFilter {

        @Override
        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
            if (stringContainsOnlyDigits(string)) {
                super.insertString(fb, offset, string, attr);
            }
        }

        @Override
        public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
            super.remove(fb, offset, length);
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            if (stringContainsOnlyDigits(text)) {
                super.replace(fb, offset, length, text, attrs);
            }
        }

        private boolean stringContainsOnlyDigits(String text) {
            for (int i = 0; i < text.length(); i++) {
                if (!Character.isDigit(text.charAt(i))) {
                    return false;
                }
            }
            return true;
        }
    }

    private TestDigitsOnlySpinner() {
    }
}


 类似资料:
  • 我正在制作一个自定义文本字段(绘制文本而不是使用JTextField)。我可以输入字符,但退格只清除一个字符。如果我再写一些东西,我可以再次删除一个字符。我不知道为什么。 KeyListener: 聊天对象中的keyTyped()方法: 我正在绘制当前的文本字符串。

  • 我想从Java程序接收Arduino Uno上的多个字节。arduino在收到数据后立即处理数据,因此我不需要存储它,我使用串行RX缓冲区作为临时存储,直到我实际读取字节为止。完全实现后,每次将发送大约150个字节,但我已经修改了缓冲区大小来解决这个问题。我使用jSerialComm作为java的串行库 我在下面放了一些arduino和java代码。当我从IDE的串行监视器发送字节,按预期点亮le

  • 对不起,如果这个问题是一个迟钝的,但我没有得到一个答案,我正在寻找。 Java docs这样说 通常,对读取器的每个读取请求都会导致对底层字符或字节流的相应读取请求。因此,建议将BufferedReader包装在任何读取()操作可能代价高昂的读取器周围,例如FileReaders>和InputStreamReaders。例如, 将缓冲来自指定文件的输入。如果不进行缓冲,每次调用read()或rea

  • 我正在尝试从Java应用程序的Google Sheets API。我已经访问了教程中提到的文件,但我无法访问我自己创建的任何文件。 这是我使用的代码: 我在Drive中手动创建了一个电子表格,用字符串填充A1: B,并从URL中复制了id,看起来像“1IeoY5jY3Su86x1uvgc1yJqEU-6dd6FdUKo8Yf5J73k”(不是实际的ID)。 这将生成错误400无法解析范围:类数据!

  • 我正在编写一个Qt GUI应用程序,它通过串行方式接收数据并将数据发送到Arduino。它写得正确,但当尝试阅读时,它不起作用。 我的问题是: 我有一个Arduino代码可以通过串行方式发送信息,我将其编程为根据接收到的数据打开和关闭针脚13上的LED: 我在MainWindow类中使用以下信号和插槽: 以及前一个插槽调用的Arduino::Read()方法: 当向Arduino写入数据时,它工作

  • 我要查找的值是 下面的HTML代码。