簡體   English   中英

JavaFX,如何防止在 ScrollPane 焦點期間調整標簽文本大小?

[英]JavaFX, how to prevent Label text resize during ScrollPane focus?

如何阻止 ScrollPane 焦點調整標簽文本的大小?

我正在用 JavaFX 制作這個汽車貸款計算器的副本。

幾乎一切都按預期工作

直到 ScrollPane 獲得焦點,右側的標題和文本才會調整大小

布局的簡要說明

所以,問題是當 ScrollPane 獲得焦點時,我的標簽文本正在調整大小。 我嘗試通過調整 ScrollPane 的屬性、包含在 ScrollPane 中的布局和標簽本身來解決這個問題。 我還搜索了之前是否有人問過類似的問題。 我還沒有發現任何東西。

謝謝

編輯:

添加了一些代碼,我盡量保持最小。 如果您關注 TextField,則所有 Label 文本的大小都會按預期進行。 如果您聚焦 ScrollPane,藍色大文本會縮小以匹配較小的黑色文本。 在這個例子中顯然不需要滾動,但它仍然顯示了我的項目確實需要滾動的問題。

package application;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.stage.Stage;

public class Main extends Application
{
    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage)
    {
        Stage stage = primaryStage;

        HBox myHBox = new HBox();

        Label smallerText = new Label("this is small\ntext");
        smallerText.setStyle("-fx-font-weight: bold");
        smallerText.setTextFill(Color.web("#000000"));
        smallerText.setFont(Font.font("Leelawadee UI", FontPosture.REGULAR, 12));

        Label biggerText = new Label("this is big\ntext");
        biggerText.setStyle("-fx-font-weight: bold");
        biggerText.setTextFill(Color.web("#005FBA"));
        biggerText.setFont(Font.font("Leelawadee UI", FontPosture.REGULAR, 24));

        TextField myTextField = new TextField();

        myHBox.getChildren().addAll(smallerText, biggerText);

        VBox myVBox = new VBox();
        myVBox.getChildren().addAll(myHBox, myTextField);

        ScrollPane myScrollPane = new ScrollPane(myVBox);
        myScrollPane.setHbarPolicy(ScrollBarPolicy.NEVER);
        myScrollPane.setVbarPolicy(ScrollBarPolicy.ALWAYS);

        Scene scene = new Scene(myScrollPane);
        stage.setScene(scene);
        stage.show();
    }

}

再次編輯:

問題已經解決。 謝謝! :)

正如所懷疑的那樣,默認的 CSS 文件實現正在影響某些事情。 您絕對應該就此提出 JIRA 票證。

但是暫時您可以通過將所有樣式聲明移動到 css 文件來解決該問題。 一切都按預期工作。

下面是我所做的。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FontResizeIssueOnFocus extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Stage stage = primaryStage;
        HBox myHBox = new HBox();

        Label smallerText = new Label("this is small\ntext");
        smallerText.getStyleClass().add("smaller-text");

        Label biggerText = new Label("this is big\ntext");
        biggerText.getStyleClass().add("bigger-text");

        TextField myTextField = new TextField();
        myHBox.getChildren().addAll(smallerText, biggerText);

        VBox myVBox = new VBox();
        myVBox.getChildren().addAll(myHBox, myTextField);

        ScrollPane myScrollPane = new ScrollPane(myVBox);
        myScrollPane.setHbarPolicy(ScrollBarPolicy.NEVER);
        myScrollPane.setVbarPolicy(ScrollBarPolicy.ALWAYS);

        Scene scene = new Scene(myScrollPane);
        scene.getStylesheets().add(getClass().getResource("scrollpanefontissue.css").toString());
        stage.setScene(scene);
        stage.show();
    }
}

在 css 文件中...

.smaller-text{
  -fx-font-weight:bold;
  -fx-text-fill:#000000;
  -fx-font-family: "Leelawadee UI";
  -fx-font-size:12px;
}
.bigger-text{
  -fx-font-weight:bold;
  -fx-text-fill:#005FBA;
  -fx-font-family: "Leelawadee UI";
  -fx-font-size:24px;
}

或者,如果您對 css 文件實現不感興趣,您可以使用內聯 css 進行聲明。 這也將解決您的問題。

Label smallerText = new Label("this is small\ntext");
smallerText.setStyle("-fx-font-weight: bold;-fx-text-fill:#000000;-fx-font-family:\"Leelawadee UI\";-fx-font-size:12px;");

Label biggerText = new Label("this is big\ntext");
biggerText.setStyle("-fx-font-weight: bold;-fx-text-fill:#005FBA;-fx-font-family:\"Leelawadee UI\";-fx-font-size:24px;");

在我的情況下,我無法通過 CSS 修復它,因為我必須使用計算的填充值,並且在偵聽器中使用諸如setStyle()類的東西太難看了。 這是引起明顯的錯誤requestLayout()被設置/被叫經由ScrollPaneBehavior方法這里 當滾動窗格獲得焦點時,它也會以某種方式刪除任何繼承和內容樣式。 所以我通過停止鼠標事件傳播來解決這個問題:

scrollPane.setOnMousePressed(Event::consume);
scrollPaneContentNode.setOnMousePressed(Event::consume);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM