InputVerifier

Модератор: Absurd

Ответить
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

сделал
два класса

Код: Выделить всё

public class General 
{
	//check if some string is numeric
	public static boolean isNonNegativeNumber(String str)
	{
		for (int i=0;i<str.length();i++)
			if (!Character.isDigit(str.charAt(i)))
				return false;
		return true;
		
	}
}

Код: Выделить всё

import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JSpinner;
import javax.swing.JTextField;

public class PositiveInputVerifier extends InputVerifier{

	public boolean verify(JComponent e) {
		if (e instanceof JTextField)
			return General.isNonNegativeNumber( ((JTextField)e).getText()	);
		if (e instanceof JSpinner)
			return General.isNonNegativeNumber( ((JSpinner)e).getValue().toString()	);
		return false;
	}

}
на главной форме есть JSpinner-mySpinner

Код: Выделить всё

mySpinner.setInputVerifier(new PositiveInputVerifier());
но чего то я могу вставлять и негативные значения. Почему?
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

извиняюсь. Вот тот код что я хотел переписать.
public class General
{
//check if some string is numeric
public static boolean isNonNegativeNumber(String str)
{
for (int i=0;i<str.length();i++)
if (!Character.isDigit(str.charAt(i))|| str.charAt(i)==('-'))
return false;
return true;

}
}
но всё равно не работает
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Код: Выделить всё

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;

public class Test extends JFrame {
	
	private static final long serialVersionUID = 1L;
	
	public Test() {
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new GridLayout(2, 1));		
		
		JSpinner mySpinner = new JSpinner();
		
		//The numbers from left to right are:
		//Starting value, minimum, maximum, step size
		SpinnerNumberModel model = new SpinnerNumberModel(0, 0, 10000, 1);
		mySpinner.setModel(model);
		
		add(mySpinner);
		add(new JButton("Button"));
		pack();
		
		setVisible(true);  
	}
		
	public static void main(String[] args) {
		new Test();
	}

}
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

Уважаемый Оскар. Это похоже на то что мне надо. Но этот подход позволяет вводить негативные значения в ручную и если кликается кнопка которая обрабатывает значение JSpinner то она получит негативное значение.
Вот в этом коде приведён пример как с помощью InputVerifier сделать так что даже фокус не снимается со спинера если так не соответствуещее значение

Код: Выделить всё

 import java.awt.*;
 import java.util.*;
 import java.awt.event.*;
 import javax.swing.*;
 
 // This program demonstrates the use of the Swing InputVerifier class.
 // It creates two text fields; the first of the text fields expects the
 // string "pass" as input, and will allow focus to advance out of it
 // only after that string is typed in by the user.

 public class K extends JFrame {
     public K() {
         JTextField tf1 = new JTextField ("Type \"pass\" here");
           getContentPane().add (tf1, BorderLayout.NORTH);
           tf1.setInputVerifier(new PassVerifier());
 
           JTextField tf2 = new JTextField ("TextField2");
           getContentPane().add (tf2, BorderLayout.SOUTH);
 
           WindowListener l = new WindowAdapter() {
               public void windowClosing(WindowEvent e) { 
                   System.exit(0); 
               }
           };
           addWindowListener(l);
     }
 
     class PassVerifier extends InputVerifier {
         public boolean verify(JComponent input) {
               JTextField tf = (JTextField) input;
               return "pass".equals(tf.getText());
         }
     }
 
     public static void main(String[] args) {
         Frame f = new K();
           f.pack();
           f.setVisible(true);
     }
 }
вот такое же мне хотелось бы провернуть только с числами
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

michael, сейчас провернём ;-)

А пока что
michael писал(а):но чего то я могу вставлять и негативные значения. Почему?
InputVerifier вообще не вызывается!
Поскольку не туда повешен.
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Код: Выделить всё

import java.awt.BorderLayout;

import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

public class Test extends JFrame {
	
	private static final long serialVersionUID = 1L;
	
	protected JSpinner mySpinner;
	
	public Test() {
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JSpinner mySpinner = new JSpinner();
		
		mySpinner.setModel(new SpinnerNumberModel(0, 0, 10000, 1));
		((JSpinner.NumberEditor)mySpinner.getEditor()).getTextField().setInputVerifier(new PositiveVerifier());
				
		add(mySpinner, BorderLayout.NORTH);
		add(new JTextField(""), BorderLayout.SOUTH);
		pack();
		
		setVisible(true);  
	}
	
	 class PositiveVerifier extends InputVerifier {
			public boolean verify(JComponent input) {
				JTextField tf = (JTextField) input;
				
				int value = 0;
				
				try {
					value = Integer.parseInt(tf.getText());
				} catch (NumberFormatException e) {
					return false;
				}
				if (value >= 0)
					return true;
				else
					return false;
			}
		}

	public static void main(String[] args) {
		new Test();
	}

}
О как они его далеко запихнули :-D
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

Премного благодарен. Обсолютно не понятно почему они так наизвразялись
Ответить