2013-11-09 6 views
0

Я хочу осуществить этот валидатор:Validator для JavaFX

http://dev-fjord.blogspot.com/2012/11/javafx-field-validation.html

я создал TextField, которую я хочу использовать для проверки номера порта:

TextField pwBox = new TextField(); 

     ErrorValidator<String> idValidator = new ErrorValidator<>(pwBox.textProperty(), new ITypeValidator<String>() 
     { 
      @Override 
      public ErrorValidator.State validate(String typeToValidate) 
      { 
       // Whatever validation code is required 
       int occurences = countOccurences(typeToValidate, '!'); 
       if (occurences == 0) 
       { 
        return State.VALID; 
       } 
       else if (occurences < 3) 
       { 
        return State.WARNING; 
       } 
       else 
       { 
        return State.ERROR; 
       } 
      } 
     }, ErrorValidator.State.VALID); 

     Text idErrorLabel = null; 
     idValidator.addStyleTargets(idErrorLabel, pwBox); 

     idValidator.stateProperty().addListener(new ChangeListener<State>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends State> observable, State oldValue, State newValue) 
      { 
       switch (newValue) 
       { 
        case ERROR: 
         idErrorLabel.setText("Too many Exclamation Marks!!!"); 
         break; 
        case WARNING: 
         idErrorLabel.setText("Be careful not to use too many Exclamation Marks!!!"); 
         break; 
       } 
      } 
     }); 

     grid.add(pwBox, 1, 2); 

Validator:

import java.util.ArrayList; 
import java.util.List; 
import javafx.beans.property.ObjectProperty; 
import javafx.beans.property.ReadOnlyObjectProperty; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.scene.Node; 

/** 
* Class for giving visual feedback about the validation state of {@link ObservableValue}s. 
* 
* @param <T> The type that is validated 
*/ 
public class ErrorValidator<T> 
{ 
    private static final String BASE_STYLE = "validated"; 

    public static enum State 
    { 
     VALID("validation_valid"), WARNING("validation_warning"), ERROR("validation_error"); 

     public final String style; 

     private State(String style) 
     { 
      this.style = style; 
     } 
    } 

    private final List<Node> styleTargets = new ArrayList<>(); 
    private ObjectProperty<State> state = new SimpleObjectProperty<>(State.VALID); 

    /** 
    * Initializes this {@link ErrorValidator} with a state that can be different from the actual validation result. 
    * 
    * @param property 
    * @param validator 
    * @param initState 
    */ 
    public ErrorValidator(final ObservableValue<? extends T> property, final ITypeValidator<? super T> validator, State initState) 
    { 
     //Preconditions.checkNotNull(initState, "The state may not be null!"); 
     state.set(initState); 

     property.addListener(new ChangeListener<T>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends T> observable, T oldValue, T newValue) 
      { 
       setState(validator.validate(newValue)); 
      } 
     }); 
    } 

    /** 
    * Initializes this {@link ErrorValidator} with a state depending on the current validation result. 
    * 
    * @param property 
    * @param validator 
    */ 
    public ErrorValidator(final ObservableValue<? extends T> property, final ITypeValidator<? super T> validator) 
    { 
     this(property, validator, validator.validate(property.getValue())); 
    } 

    private void setState(State newState) 
    { 
     if (state.get() == newState) 
     { 
      return; 
     } 
     //Preconditions.checkNotNull(newState, "The state may not be null!"); 

     for (Node node : styleTargets) 
     { 
      node.getStyleClass().remove(state.get().style); 
      node.getStyleClass().add(newState.style); 
     } 

     this.state.set(newState); 
    } 

    /** 
    * Adds a new {@link Node} that should receive styleclasses depending of the validation state of this validator. 
    * 
    * @param node 
    */ 
    public void addStyleTarget(Node node) 
    { 
     styleTargets.add(node); 
     node.getStyleClass().add(state.get().style); 
     node.getStyleClass().add(BASE_STYLE); 
    } 

    /** 
    * Adds new {@link Node}s that should receive styleclasses depending of the validation state of this validator. 
    * 
    * @param nodes 
    */ 
    public void addStyleTargets(Node... nodes) 
    { 
     for (Node node : nodes) 
     { 
      addStyleTarget(node); 
     } 
    } 

    public ReadOnlyObjectProperty<State> stateProperty() 
    { 
     return state; 
    } 
} 

Интерфейс:

public interface ITypeValidator<T> 
{ 
    ErrorValidator.State validate(T typeToValidate); 
} 

По какой-то причине, когда я запустить приложение и открыть окно, которое держит в поле ввода с валидатора не открыл окно. У меня есть ошибка кода Java, которую я не могу найти. В Netbeans сообщений об ошибках нет. Можете ли вы помочь мне найти проблему?

+0

попробуйте удалить валидатор и открыть окно, это работает? – AsG

+0

Да, когда я удаляю валидатор, он работает нормально. –

+0

Решена ли эта проблема? –

ответ

2

Давать ему быстро попробовать, линию

node.getStyleClass().add(state.get().style); 

в addStyleTarget(Node node) бросает NullPointerException. Но, возможно, это связано с тем, что я не полностью знаю ваш основной класс приложений.