> I would start by looking at what Font.getDefault().getSize() returns since everything should be based off that.

I think the code below is the code that decides what the code above should return

> Another thing to check is that the reported DPI of the screen is correct.

The way I read the code below is that it wants the default font to be 1/6 of an inch high on the screen. I think any smaller than 6 lines per inch and it will be hard to read. To do this correctly, it relies on
the y-res being accurate for the device.

So I would follow the path Kevin suggests. For example if something is wrongly returning the *dimension* of the screen when it should be the *dpi* of the screen then you'd have 6 lines of text filling up the screen.

-phil.

On 4/20/20, 1:56 PM, Kevin Rushforth wrote:
Another thing to check is that the reported DPI of the screen is correct.

-- Kevin


On 4/20/2020 1:25 PM, David Grieve wrote:
The sizes of controls are controlled by CSS styles. Things like borders, backgrounds, padding, insets, all of that defaults to the styles in a stylesheet. Most sizes are 'em' units, meaning they are relative to the size of the font. JavaFX CSS will use the Font.getDefault() font size if there is no font explicitly set in either the
styles or in the application code.

I would start by looking at what Font.getDefault().getSize() returns since everything should be based off that.
It could also be an issue with the default stylesheets themselves.

-----Original Message-----
From: openjfx-dev <openjfx-dev-boun...@openjdk.java.net> On Behalf Of Alexander Scherbatiy
Sent: Monday, April 20, 2020 2:16 PM
To: openjfx-dev@openjdk.java.net
Subject: [EXTERNAL] JavaFX controls have large size on Raspberry Pi

Hello,

I run a simple JavaFX application which shows a button with jdk 14.0.1 on Raspberry Pi and the drawn button has large size.

This is because of the algorithm which is used by
PrismFontFactory.getSystemFontSize() method [1] to select a system font size.
If a system is embedded then the font size is calculated as

      int screenDPI = Screen.getMainScreen().getResolutionY();
      systemFontSize = ((float) screenDPI) / 6f; // 12 points

and the system is detected as embedded because the armv6hf architecture is defined as embedded in the armv6hf.gradle file [2].

Raspberri Pi can work both with small touch displays and with big monitors. It looks like Raspberry Pi should support two modes for font size calculation: one for small screens and another for large.

I would like to contribute a fix for this but I do not know how the right fix could look like. Should there be a special screen size so for smaller screens the font is is proportional to the screen size and for bigger screens the font size is fixed?
Is there a way to check that used screen is from embedded device?
May be it should be solved in different way?

[1]
https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2Fmodules%2Fjavafx.graphics%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsun%2Fjavafx%2Ffont%2FPrismFontFactory.java%23L1944&amp;data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&amp;sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3D&amp;reserved=0
[2]
https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2FbuildSrc%2Farmv6hf.gradle%23L182&amp;data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&amp;sdata=Fv2sKXwfwuo6JsD0CyeoF6iDmq8rDk5goPCsK31p1Sk%3D&amp;reserved=0

JavaFX application:
----------------------------
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

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

      @Override
      public void start(Stage primaryStage) {
          primaryStage.setTitle("Hello World!");
      Button button = new Button("Hello, World!");

          StackPane root = new StackPane();
          root.getChildren().add(button);
          primaryStage.setScene(new Scene(root, 300, 250));
          primaryStage.show();
      }
}
----------------------------

Thanks,
Alexander.



Reply via email to