JavaFX:TextField中的错误文本对齐方式

时间:2018-06-04 15:45:55

标签: javafx textfield

当我将文字设置为大于TextField(带对齐 - 中心)的大小时:我明白了:
enter image description here

当我将光标向右移动时,线条的位置无法返回到前一个位置。您可以将光标移到末尾,然后该行将以所需的形式显示 enter image description here

当尺寸较小时,文字会正确显示: enter image description here

我更改了fx-alignmentfx-fontfx-heightfx-width。其他参数是默认值。

我想找到一种在TextField上正确显示大文字的方法。

2 个答案:

答案 0 :(得分:0)

我发现如果您致电appendText("")甚至end()

tf.setText("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
tf.appendText("");
// tf.end();

然后它会使它更新并正确对齐,只需检查是否有任何意外的副作用。

不可否认,我没有深入挖掘,以找出为什么这个错误首先发生,但这种解决方法现在应该足够了吗?

答案 1 :(得分:0)

不,它并不总是发生。在您的示例中,它会发生,因为您在显示舞台后设置了初始文本。

public class TextAlign extends Application {

   /*
    * (non-Javadoc)
    * @see javafx.application.Application#start(javafx.stage.Stage)
    */
   @Override
   public void start(Stage primaryStage) throws Exception {

      BorderPane bp = new BorderPane();
      TextField tf = new TextField();
      tf.setAlignment(Pos.CENTER);
      tf.setPrefColumnCount(20);
      tf.setMaxWidth(200);
      // Default text is part of initialization.
      tf.setText("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
      bp.setCenter(tf);
      Scene scene = new Scene(bp, 300, 300);
      primaryStage.setScene(scene);
      primaryStage.show();

   }
}

此外,如果你使用FXML(就像在JavaFX中推荐的那样,即使不是强制性的),你也不会有这种行为,因为一切都按照正确的顺序完成。

修改

根据您添加的信息,我会使用Label代替TextField。如果单词太长,请选择相应的textOverrunellipsis,并添加Tooltip以便在需要时查看整个标签。设置标签的样式,以使你的Label看起来像想要的TextField(我没有在这个例子中使用css,但我应该有,如果我不是懒惰的话)。

  

控制器 TextAlignCtrl.java

public class TextAlignCtrl extends BorderPane {

   @FXML
   private Label summary;

   public TextAlignCtrl() {
      FXMLLoader loader = new FXMLLoader(getClass().getResource("TextAlign.fxml"));
      loader.setController(this);
      loader.setRoot(this);

      try {
         loader.load();
      } catch(IOException e) {
         System.out.println("An error occurs trying to load the FXML TextAlign component." + e);
         e.printStackTrace();
      }
   }

   @FXML
   private void initialize() {
      summary.setText("Author - Music Name");
      Tooltip tooltip = new Tooltip();
      tooltip.textProperty().bind(summary.textProperty());
      Tooltip.install(summary, tooltip);
   }

   @FXML
   private void copyTextField(MouseEvent e) {
      System.out.println("Mouse released on label");
   }

   @FXML
   private void selectLabel(MouseEvent e) {
      String lText = ((Label) e.getSource()).getText();
      System.out.println("Label selection " + lText);
      summary.setText(lText);
   }
}
  

FXML TextAlign.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<fx:root type="BorderPane" xmlns:fx="http://javafx.com/fxml/1">
    <left>
        <VBox>
            <HBox>
                <Label fx:id="lbl1" text="U2 - I Still Haven't Found What I'm Looking For"
                    onMouseClicked="#selectLabel" />
            </HBox>
            <HBox>
                <Label fx:id="lbl2" text="Bob Marley - One love"
                    onMouseClicked="#selectLabel" />
            </HBox>
            <HBox>
                <Label fx:id="lbl3" text="Scorpions - Still loving you" onMouseClicked="#selectLabel" />
            </HBox>
            <HBox>
                <Label fx:id="lbl4" text="Queen - We will rock you." onMouseClicked="#selectLabel" />
            </HBox>
        </VBox>
    </left>
    <top>
        <HBox alignment="CENTER">
            <Label fx:id="summary" alignment="CENTER"
                style="-fx-border-color:grey;-fx-border-width:2px;" onMouseReleased="#copyTextField"
                pickOnBounds="false" prefHeight="35.0" prefWidth="250.0" textOverrun="CENTER_WORD_ELLIPSIS" ellipsisString="[...]" >
                <font>
                    <Font name="Arial" size="16.0" />
                </font>
            </Label>
            <!-- <TextField fx:id="textField" alignment="CENTER" disable="false" editable="true" 
                onMouseReleased="#copyTextField" style="-fx-text-overrun:CENTER;" pickOnBounds="false" 
                prefHeight="35.0" prefWidth="250.0" promptText="Author - Music Name" > <font> 
                <Font name="Arial" size="16.0" /> </font> </TextField> -->
        </HBox>
    </top>
</fx:root>
  

应用程序入口点 MainTextAlign.java

public class MainTextAlign extends Application {

   @FXML
   private TextField tf;

   /*
    * (non-Javadoc)
    * @see javafx.application.Application#start(javafx.stage.Stage)
    */
   @Override
   public void start(Stage primaryStage) throws Exception {

      TextAlignCtrl bp = new TextAlignCtrl();

      Scene scene = new Scene(bp, 300, 300);
      primaryStage.setScene(scene);
      primaryStage.show();
   }
}

short words long words