![](/img/trans.png)
[英]How to get the position of a Label object inside a ScrollPane in JavaFX 8
[英]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.