FULL PRODUCT VERSION :
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
In the node javafx.scene.text.Text, the property textAlignment appears to be broken and does not work as expected. The same property textAlignment appears to work correctly in the control javafx.scene.control.Label.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Create a multi-line String and render in into a javafx.scene.text which has its textAlignment property set to javafx.scene.text.TextAlignment.RIGHT, CENTER or JUSTIFY.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The text will be expected to be aligned using right, center or justify justification.
ACTUAL -
The text is rendered using left justification.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
The following JavaFX application demonstrates the issue by comparing text rendering using javafx.scene.text.Text, javafx.scene.control.Label and javafx.scene.web.WebView. The ComboBox in the toolbar allows to change text justification in all 3 controls:
package test;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.SplitPane;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.scene.text.TextFlow;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.w3c.dom.Node;
public class Test_FontRendering extends Application {
@Override
public void start(Stage primaryStage) {
final String plainString = "Lorem ipsum dolor sit amet.\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Cras dolor purus, scelerisque tincidunt vestibulum at, elementum et arcu. Nulla erat purus, feugiat id ante eget, eleifend sollicitudin tortor. Quisque non elit eget purus hendrerit faucibus. Vestibulum in varius leo. Nam gravida urna vitae elementum accumsan. Donec tincidunt lorem et mollis blandit. Nam varius facilisis nisl. Curabitur eu ex quis odio sodales tempor sit amet sit amet orci. Mauris efficitur vestibulum felis. Cras pellentesque ipsum et lectus feugiat, sit amet tincidunt urna lacinia. Sed orci neque, varius a suscipit eu, ultricies ac purus.";
final String htmlString = "<html><head></head><body style=\"margin: 0px; font-family: arial; font-size: 12px;\"><div style=\"text-align:justify;\">Lorem ipsum dolor sit amet.<br>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras dolor purus, scelerisque tincidunt vestibulum at, elementum et arcu. Nulla erat purus, feugiat id ante eget, eleifend sollicitudin tortor. Quisque non elit eget purus hendrerit faucibus. Vestibulum in varius leo. Nam gravida urna vitae elementum accumsan. Donec tincidunt lorem et mollis blandit. Nam varius facilisis nisl. Curabitur eu ex quis odio sodales tempor sit amet sit amet orci. Mauris efficitur vestibulum felis. Cras pellentesque ipsum et lectus feugiat, sit amet tincidunt urna lacinia. Sed orci neque, varius a suscipit eu, ultricies ac purus.</div></body></html>";
final Text text = new Text(plainString);
text.setTextAlignment(TextAlignment.RIGHT);
final TextFlow textFlow = new TextFlow(text);
final Label label = new Label(plainString);
label.setTextAlignment(TextAlignment.JUSTIFY);
label.setWrapText(true);
StackPane.setAlignment(label, Pos.TOP_LEFT);
final WebView webView = new WebView();
webView.getEngine().loadContent(htmlString);
final StackPane top = new StackPane(textFlow);
final StackPane middle = new StackPane(label);
final StackPane bottom = new StackPane(webView);
final SplitPane splitPane = new SplitPane(top, middle, bottom);
splitPane.setOrientation(Orientation.VERTICAL);
final ComboBox<TextAlignment> textAlignementCombo = new ComboBox();
textAlignementCombo.getItems().setAll(TextAlignment.values());
textAlignementCombo.getSelectionModel().select(TextAlignment.JUSTIFY);
textAlignementCombo.valueProperty().addListener(observable -> {
final TextAlignment newValue = textAlignementCombo.getValue();
text.setTextAlignment(newValue);
label.setTextAlignment(newValue);
final Node div = webView.getEngine().getDocument().getElementsByTagName("div").item(0);
final Node textAlign = div.getAttributes().getNamedItem("style");
final String htmlStyle = String.format("text-align:%s;", newValue.name().toLowerCase());
textAlign.setNodeValue(htmlStyle);
});
final ToolBar toolBar = new ToolBar(textAlignementCombo);
final BorderPane root = new BorderPane();
root.setCenter(splitPane);
root.setTop(toolBar);
Scene scene = new Scene(root, 600, 600);
primaryStage.setTitle("Test");
primaryStage.setScene(scene);
primaryStage.show();
Platform.runLater(() -> splitPane.setDividerPositions(0.33, 0.66));
}
public static void main(String[] args) {
launch(args);
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
We may have to use javafx.scene.control.Label instead in the mean time.
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
In the node javafx.scene.text.Text, the property textAlignment appears to be broken and does not work as expected. The same property textAlignment appears to work correctly in the control javafx.scene.control.Label.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Create a multi-line String and render in into a javafx.scene.text which has its textAlignment property set to javafx.scene.text.TextAlignment.RIGHT, CENTER or JUSTIFY.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The text will be expected to be aligned using right, center or justify justification.
ACTUAL -
The text is rendered using left justification.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
The following JavaFX application demonstrates the issue by comparing text rendering using javafx.scene.text.Text, javafx.scene.control.Label and javafx.scene.web.WebView. The ComboBox in the toolbar allows to change text justification in all 3 controls:
package test;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.SplitPane;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.scene.text.TextFlow;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.w3c.dom.Node;
public class Test_FontRendering extends Application {
@Override
public void start(Stage primaryStage) {
final String plainString = "Lorem ipsum dolor sit amet.\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Cras dolor purus, scelerisque tincidunt vestibulum at, elementum et arcu. Nulla erat purus, feugiat id ante eget, eleifend sollicitudin tortor. Quisque non elit eget purus hendrerit faucibus. Vestibulum in varius leo. Nam gravida urna vitae elementum accumsan. Donec tincidunt lorem et mollis blandit. Nam varius facilisis nisl. Curabitur eu ex quis odio sodales tempor sit amet sit amet orci. Mauris efficitur vestibulum felis. Cras pellentesque ipsum et lectus feugiat, sit amet tincidunt urna lacinia. Sed orci neque, varius a suscipit eu, ultricies ac purus.";
final String htmlString = "<html><head></head><body style=\"margin: 0px; font-family: arial; font-size: 12px;\"><div style=\"text-align:justify;\">Lorem ipsum dolor sit amet.<br>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras dolor purus, scelerisque tincidunt vestibulum at, elementum et arcu. Nulla erat purus, feugiat id ante eget, eleifend sollicitudin tortor. Quisque non elit eget purus hendrerit faucibus. Vestibulum in varius leo. Nam gravida urna vitae elementum accumsan. Donec tincidunt lorem et mollis blandit. Nam varius facilisis nisl. Curabitur eu ex quis odio sodales tempor sit amet sit amet orci. Mauris efficitur vestibulum felis. Cras pellentesque ipsum et lectus feugiat, sit amet tincidunt urna lacinia. Sed orci neque, varius a suscipit eu, ultricies ac purus.</div></body></html>";
final Text text = new Text(plainString);
text.setTextAlignment(TextAlignment.RIGHT);
final TextFlow textFlow = new TextFlow(text);
final Label label = new Label(plainString);
label.setTextAlignment(TextAlignment.JUSTIFY);
label.setWrapText(true);
StackPane.setAlignment(label, Pos.TOP_LEFT);
final WebView webView = new WebView();
webView.getEngine().loadContent(htmlString);
final StackPane top = new StackPane(textFlow);
final StackPane middle = new StackPane(label);
final StackPane bottom = new StackPane(webView);
final SplitPane splitPane = new SplitPane(top, middle, bottom);
splitPane.setOrientation(Orientation.VERTICAL);
final ComboBox<TextAlignment> textAlignementCombo = new ComboBox();
textAlignementCombo.getItems().setAll(TextAlignment.values());
textAlignementCombo.getSelectionModel().select(TextAlignment.JUSTIFY);
textAlignementCombo.valueProperty().addListener(observable -> {
final TextAlignment newValue = textAlignementCombo.getValue();
text.setTextAlignment(newValue);
label.setTextAlignment(newValue);
final Node div = webView.getEngine().getDocument().getElementsByTagName("div").item(0);
final Node textAlign = div.getAttributes().getNamedItem("style");
final String htmlStyle = String.format("text-align:%s;", newValue.name().toLowerCase());
textAlign.setNodeValue(htmlStyle);
});
final ToolBar toolBar = new ToolBar(textAlignementCombo);
final BorderPane root = new BorderPane();
root.setCenter(splitPane);
root.setTop(toolBar);
Scene scene = new Scene(root, 600, 600);
primaryStage.setTitle("Test");
primaryStage.setScene(scene);
primaryStage.show();
Platform.runLater(() -> splitPane.setDividerPositions(0.33, 0.66));
}
public static void main(String[] args) {
launch(args);
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
We may have to use javafx.scene.control.Label instead in the mean time.
- relates to
-
JDK-8145496 Incorrect TextLayout word wrap with right or center text alignment
-
- Closed
-