在 javafx 中显示按钮的 TextField 类型
TextField type to Show Button in javafx
我正在尝试在 TextField 上显示一个看起来像 Windows javafx 中的 8 Metro 主题的按钮。
If TextField is empty button is invisible otherwise button show.
在这个阶段,我离成功还差得很远。我用这段代码来制作它。
@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);
}
});
然后 btn 显示是否有任何字符输入到 TextField
向 TextField 的 textProperty()
添加侦听器。检查该值是否为空,隐藏按钮否则显示它。每当从文本字段中添加或删除字符时都会调用它。
这里是一个MCVE,你可以在controller的initialize方法中添加listener即可
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);
}
}
您可能还更喜欢使用 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".
上附加监听器
我正在尝试在 TextField 上显示一个看起来像 Windows javafx 中的 8 Metro 主题的按钮。
If TextField is empty button is invisible otherwise button show.
在这个阶段,我离成功还差得很远。我用这段代码来制作它。
@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);
}
});
然后 btn 显示是否有任何字符输入到 TextField
向 TextField 的 textProperty()
添加侦听器。检查该值是否为空,隐藏按钮否则显示它。每当从文本字段中添加或删除字符时都会调用它。
这里是一个MCVE,你可以在controller的initialize方法中添加listener即可
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);
}
}
您可能还更喜欢使用 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".