【问题标题】:JavaFX : bad text alignment in TextFieldJavaFX:TextField 中的文本对齐错误
【发布时间】:2018-06-04 15:45:55
【问题描述】:

当我设置大于 TextField 大小的文本时(对齐 - 中心):我得到这个:

当我将光标向右移动时,该行的位置无法返回到之前的位置。您可以将光标移到末尾,然后该行将采用所需的形式

文本在尺寸较小时正确显示: .

我改变fx-alignmentfx-fontfx-heightfx-width。其他参数默认。

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

【问题讨论】:

  • 没有看到任何代码/FXML/css 就无法说出问题所在。
  • @Pagbo 好吧,我认为不需要代码,因为当文本大于宽度时,它总是使用通常的参数发生。一些示例 BorderPane bp = new BorderPane();文本字段 tf = new TextField(); tf.setAlignment(Pos.CENTER); tf.setPrefColumnCount(20); tf.setMaxWidth(200); bp.setCenter(tf);场景场景 = 新场景(bp, 300, 300); stage.setScene(场景);舞台.show(); tf.setText("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
  • 您应该编辑您的帖子和代码以获得更多可见性。

标签: javafx textfield


【解决方案1】:

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

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 以便在需要时查看整个标签。设置标签的样式以使您的标签看起来像想要的 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();
   }
}

【讨论】:

  • 这只是代码示例。我需要在程序执行期间更改 TextField 的文本。同样在我的真实项目中,一切都是用 fhml 编写的。
  • @Pagdo 是的。只有程序可以更改文本,而不是用户
  • @DimaGarbar 这实际上是一个问题,但我不认为TextField 是最好的解决方案。请看看我的编辑。
  • @Pagdo 我把它作为正确答案,但我想你明白 TextField 不能正常工作。
  • @DimaGarbar 正如我所说,这似乎是一个问题。但是我没有找到任何关于它在这种情况下应该有的行为的文档。显然它与插入符号相关联,但另一方面,TextField 专用于用户输入(即使可以用它显示文本)。然后我想知道打开一个bug是否更糟糕。
【解决方案2】:

我发现如果你打电话给appendText("") 甚至end():

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

然后它会导致它正确更新和对齐,只需检查没有任何意外的副作用。

诚然,我还没有深入了解为什么首先会发生此错误,但是这种解决方法现在应该就足够了,嗯?

【讨论】:

  • 现在这是最好的答案。如果很快没有人更准确地回答问题是什么,那么我将结束这个问题。
猜你喜欢
  • 1970-01-01
  • 2012-08-23
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2015-06-04
  • 1970-01-01
  • 2011-12-26
相关资源
最近更新 更多