、あなたは色のbackroundのとText
またはLabel
が必要な場合は、任意のRectangle
オブジェクトせずに、単一Label
またはText
のためのCSSを使用するための最も簡単な方法。この質問は本当に上
例は、CSS
Main.java
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
HBox root = new HBox();
Scene scene = new Scene(root,400,400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
Label message = new Label();
TextArea textArea = new TextArea();
textArea.setPrefWidth(200);
textArea.setText("message");
message.textProperty().bind(textArea.textProperty());
message.getStyleClass().add("rounded-background-label");
root.getChildren().addAll(message, textArea);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
application.css
.rounded-background-label {
-fx-background-color: black, white;
-fx-background-insets: 0, 1;
-fx-padding: 10px;
-fx-background-radius: 12px;
}
@jewelseaからの回答でラベルを使用します詳細:
JavaFX 2: resizable rectangle containing text
しかし、あなたはラベル+長方形ソリューション
に滞在したい場合、私はそれがこのバグに関連している恐れ:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8137252
回避策として、あなたは、レイアウトの更新を要求することができますあなたがリスナーで試したように、StackPane
の
あなたのコードの唯一の問題は、あなたが交換する必要があることです。
pane.layout();
をレイアウトはGUIのスレッドで発生することを保証します
Platform.runLater(new Runnable() {
@Override
public void run() {
pane.requestLayout();
}
});
で。
例
LabelRectangleTest。信じられないほど詳細な回答のためのFXML
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.shape.*?>
<HBox prefHeight="100.0" prefWidth="200.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="application.LabelRectangleTestController">
<children>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<StackPane fx:id="pane" minHeight="126.0" prefHeight="126.0" prefWidth="200.0" HBox.hgrow="ALWAYS">
<children>
<Rectangle fx:id="bubble" arcHeight="15.0" arcWidth="15.0" fill="WHITE" height="27.75" stroke="BLACK" strokeType="INSIDE" width="68.0" />
<Label fx:id="message" text="Label" />
</children>
</StackPane>
<TextArea fx:id="textArea" prefWidth="200.0" wrapText="true" />
</children>
</HBox>
</children>
</HBox>
LabelRectangleTestController.java
public class LabelRectangleTestController implements Initializable {
@FXML
private Label message;
@FXML
private Rectangle bubble;
@FXML
private StackPane pane;
@FXML
private TextArea textArea;
@Override
public void initialize(URL location, ResourceBundle resources) {
textArea.setText("message");
message.textProperty().bind(textArea.textProperty());
message.widthProperty().addListener((observable, oldValue, newValue) -> {
bubble.setWidth(newValue.intValue() + 10);
Platform.runLater(new Runnable() {
@Override
public void run() {
pane.requestLayout();
}
});
});
message.heightProperty().addListener((observable, oldValue, newValue) -> {
bubble.setHeight(newValue.doubleValue() + 10);
Platform.runLater(new Runnable() {
@Override
public void run() {
pane.requestLayout();
}
});
});
}
}
Main.javaは
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("LabelRectangleTest.fxml"));
HBox root = loader.load();
Scene scene = new Scene(root,400,400);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
感謝。私はCSSソリューションがいいと思う。 –