Проверка данных на наличие в полях только цифр и знака минус

209
21 января 2019, 13:20

Мне необходимо проверить правильность заполнения текстовых полей в созданном JFrame. В этих полях должны быть только цифры и знак минус.

Пытался написать алгоритм с использованием функции getKeyChar(). Но она не определяется в классе NewJFrame даже после написания в начале программы таких строк:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

Как можно реализовать ввод именно числовых значений (в том числе и отрицательных) в текстовых полях с дальнейшим использованием этих значений в вычислениях?

Исходный код (без обработки случаев неправильного ввода):

public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
    initComponents();
}private void cActionPerformed(java.awt.event.ActionEvent evt) {                                  
    // TODO add your handling code here:
}                                 
private void aActionPerformed(java.awt.event.ActionEvent evt) {                                  
}                                 
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
double a,b,c,x;
a = Double.parseDouble(this.a.getText());
b = Double.parseDouble(this.b.getText());
c = Double.parseDouble(this.c.getText());
x = Double.parseDouble(this.x.getText());
double y = (Math.pow(a,2)+Math.pow(x, 2)*Math.pow(2.71,-b+Math.pow(x,3)))/(Math.sin(c*x)+4.79);
this.y.setText(Double.toString(y));
}                                        
private void xActionPerformed(java.awt.event.ActionEvent evt) {                                  
    // TODO add your handling code here:
}                                 
// Variables declaration - do not modify                     
private javax.swing.JTextField a;
private javax.swing.JTextField b;
private javax.swing.JTextField c;
private javax.swing.JButton jButton1;
private javax.swing.JDesktopPane jDesktopPane1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JSpinner jSpinner1;
private javax.swing.JTextField x;
private javax.swing.JTextField y;
// End of variables declaration
}  

Некоторые шаблонные блоки кода я не стал копировать.

Answer 1

Подправьте просто regex как вам надо, я думаю это, что вам надо.

import java.awt.BorderLayout;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
@SuppressWarnings("serial")
public class JavaRanch extends JPanel
{
    private JLabel inputLabel;
    private NumericTextField inputField;
    public JavaRanch()
    {
        super(new BorderLayout());
        inputLabel = new JLabel("Enter value: ");
        inputField = new NumericTextField();
        inputField.setColumns(10);
        this.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        this.add(inputLabel, BorderLayout.WEST);
        this.add(inputField, BorderLayout.CENTER);
    }
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    JFrame frame = new JFrame("Numeric Text Field Demo");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new JavaRanch());
                    frame.pack();
                    frame.setVisible(true);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }
}
@SuppressWarnings("serial")
class NumericTextField extends JTextField
{
    @Override
    protected Document createDefaultModel()
    {
        return new NumericDocument();
    }
    private static class NumericDocument extends PlainDocument
    {
        // The regular expression to match input against (zero or more digits)
        private final static Pattern DIGITS = Pattern.compile("\\d*");
        @Override
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
        {
            // Only insert the text if it matches the regular expression
            if (str != null && DIGITS.matcher(str).matches())
                super.insertString(offs, str, a);
        }
    }
}
READ ALSO
Hibernate Postgress exception Error accessing index information

Hibernate Postgress exception Error accessing index information

Сделал таблички: Магазин(Shop) Товар(Item) Табличка связи(item_x_shop)

263
Scanner пропускает строки

Scanner пропускает строки

проблема заключается в том что при считывании данных с клавиатуры с помощью методов класса Scanner, он пропускает строки (Date и Notes)Насколько я понял...

171