JavaFX: плохое выравнивание текста в TextField - PullRequest
0 голосов
/ 04 июня 2018

Когда я устанавливаю текст больше, чем размер TextField (с выравниванием - Центр): я получаю это:
enter image description here.

Когда я перемещаю курсорвправо, позиция линии не может быть возвращена к предыдущей позиции.Вы можете довести курсор до конца, и тогда строка будет в нужной форме enter image description here

Текст отображается правильно, когда размер меньше: enter image description here.

Я изменяю fx-alignment, fx-font, fx-height, fx-width.Другие параметры по умолчанию.

Я хочу найти способ правильно отображать большой текст в TextField.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Нет, это не всегда происходит.В вашем примере это происходит, потому что вы установили исходный текст после показа сцены.

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.Выберите соответствующие textOverrun и ellipsis, если слово слишком длинное, и добавьте Tooltip, чтобы при необходимости увидеть всю метку.Установите стиль метки, чтобы ваша метка выглядела как нужное TextField (я не использовал css для этого примера, но мне следовало бы, если бы я не был ленивым).

Controller 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

0 голосов
/ 04 июня 2018

Я обнаружил, что если вы звоните appendText("") или даже end():

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

, то это приводит к его корректному обновлению и выравниванию, просто убедитесь, что нет никаких непреднамеренных побочных эффектов.

По общему признанию, я не выкопал достаточно глубоко, чтобы выяснить, почему эта ошибка вообще возникает, но этого обходного пути должно быть достаточно, а?

...