2015-06-01 2 views
0

Я пытаюсь показать кнопку на TextField, как тема Windows 8 Metro в javafx.Тип TextField для кнопки «Показать» в javafx

Если TextField пуст, кнопка невидима, иначе показывается кнопка.

На этом этапе я немного близок к успеху. Я использую этот код для его создания.

@FXML 
private TextField tfMyName;//fx:id="tfMyName" 
@FXML 
private Button btnClear;//fx:id="btnClear" 

@Override 
public void initialize(URL url, ResourceBundle rb) { 

    clearTextFieldByButton(tfMyName, btnClear); 
} 

public void clearTextFieldByButton(TextField value, Button btn){ 

    btn.setVisible(false); 

    value.setOnKeyTyped(new EventHandler<KeyEvent>(){ 
     @Override 
     public void handle(KeyEvent event) { 
      if ((value.textProperty().get().length() < 0) || (value.textProperty().get().equals(""))) { 
       btn.setVisible(false); 
      } else if (value.textProperty().get().length() > -1 || (!value.textProperty().get().equals(""))) { 
       btn.setVisible(true); 
      } 
     } 
    }); 

    btn.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      tfMyName.clear(); 
      btn.setVisible(false); 
      tfMyName.requestFocus(); 
     } 
    }); 

Используя этот код на кнопку по умолчанию невидима, но кнопка отображается только, когда я типа более чем один символов. Но мне нужно, если что-то вводит в TextField для кнопки.

Но когда я удалить условие, при KeyEvent заменить

value.setOnKeyTyped(new EventHandler<KeyEvent>(){ 
    @Override 
    public void handle(KeyEvent event) { 
      btn.setVisible(true); 
    } 
}); 

Тогда БТН шоу, если любой входной символ в TextField

ответ

1

Вы также можете предпочесть использовать JavaFX обязательный механизм:

@Override 
public void start(final Stage primaryStage) 
{ 
    TextField textfield = new TextField(); 
    Button button = new Button("my button"); 
    button.visibleProperty().bind(textfield.textProperty().isEmpty().not()); 

    final Scene scene = new Scene(new HBox(button, textfield), 800, 600); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

Реальная проблема в вашем коде:
Вы присоединили слушателя на поле, когда «OnKeyTyped», на этом этапе вновь напечатанный текст не добавляется к текстовому значению текстового поля, поэтому ваше условие if-else его не увидит. Вместо этого правильным способом должно быть присоединение слушателя к «OnKeyReleased».

+0

Проблема с OnKeyReleased. Спасибо за ваше предложение. –

1

Добавить слушателя в textProperty() в TextField. Проверьте, пусто ли это, скрыть кнопку еще раз. Он будет вызываться всякий раз, когда символ добавляется или удаляется из текстового поля.

Вот MCVE, вы можете просто добавить слушателя к методу инициализации контроллера.

import javafx.application.Application; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class HideButtonOnTextEntered extends Application { 

    @Override 
    public void start(Stage stage) { 
     TextField textField = new TextField(); 
     Button button = new Button("Button"); 
     button.setVisible(false); 
     VBox root = new VBox(20, textField, button); 
     root.setAlignment(Pos.CENTER); 
     Scene scene = new Scene(root, 200, 200); 
     stage.setScene(scene); 
     stage.show(); 
     textField.textProperty().addListener((ov, oldValue, newValue) -> { 
      if (newValue.isEmpty()) { 
       button.setVisible(false); 
      } else { 
       button.setVisible(true); 
      } 
     }); 
    } 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 
Смежные вопросы