JavaFX CSS не работает

У меня возникли проблемы с тем, что этот образец не стилизует фоновую границу зеленого цвета. CSS не имеет никакого эффекта, независимо от того, насколько я его настраиваю. Мой код:

StackoverflowQuestion.scala

import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.scene.Scene
import scalafx.scene.control.Button
import scalafx.scene.layout.BorderPane

object StackoverflowQuestion extends JFXApp {

   stage = new PrimaryStage {
      title = "Stackoverflow Sample"

      scene = new Scene {
         stylesheets add getClass.getResource("app.css").toExternalForm

         content = new BorderPane {
            id = "background"

            center = new Button {
               text = "Button"
            }
         }
      }
   }
}

app.css

#background {
    -fx-background-color: green;
}

Я видел этот связанный пост, но у него нет ответа JavaFx Css не работает с eclipse. Я знаю, что css читается, потому что он печатает ошибку, если я удаляю фигурную скобку из css


person J Atkin    schedule 22.04.2015    source источник


Ответы (2)


Глядя на ваш исходный код. Проблема скорее в макете, чем в CSS. Панель закрыта кнопкой, поэтому вы ее не видите. Вам нужно убедиться, что панель больше, чем кнопка, например, добавьте отступ к вашему CSS:

#background {
    -fx-background-color: green;
    -fx-padding: 10;
}

Вот что я вижу, когда делаю это:

Кнопка с отступами и зеленым фоном

Второе, что вы можете сделать, это изменить content на root, чтобы ваша панель заполнила Scene, у вас будет

root = new BorderPane { ...

Когда вы используете root, вы помещаете панель прямо на сцену. Ограничение состоит в том, что вы можете назначить Parent только root (здесь нет проблем). Когда вы используете content, вы можете назначить любой Node, но сначала он будет заключен в Group, прежде чем будет назначен root. Обертывание в Group меняет способ создания макета, в вашем случае ограничивая размер BorderPane его содержимым, а растягивая его, чтобы он соответствовал размеру Scene.

person Jarek    schedule 23.04.2015
comment
Ах, спасибо. Это именно то, что искал. Я понятия не имел, что root был правильным способом сделать это. Большое спасибо. - person J Atkin; 23.04.2015

я надеюсь, что это поможет вам

package application;

import java.io.IOException;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class StackOverFlow extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {
        primaryStage.setTitle("JavaFX Welcome");
        BorderPane pane = new BorderPane();
        pane.setId("pane");

        Scene scene = new Scene(pane);

        primaryStage.setScene(scene);
        scene.getStylesheets().add(Welcome.class.getResource("application.css").toExternalForm());
        
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
#pane{
	-fx-background-color: green;
}

person Thomas    schedule 22.04.2015
comment
Спасибо за ответ. Я искал больше, поэтому это не сработает, но в любом случае спасибо. Кстати, откуда взялось Welcome.class? Ваш класс называется StackOverFlow . - person J Atkin; 22.04.2015
comment
Добро пожаловать, это название проекта, я забыл изменить имя класса, но оно все равно работает. - person Thomas; 22.04.2015
comment
Извините, я больше не могу вам помочь, я не знаю scala. - person Thomas; 22.04.2015
comment
Ну, в любом случае спасибо, похоже, я буду играть еще некоторое время - person J Atkin; 22.04.2015
comment
нет, у меня такая же проблема с репутацией, во всяком случае, я думал поместить .root в файл css вместо id #pane. - person Thomas; 22.04.2015
comment
на самом деле.root ничего не стилизует docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/ "The Scene object has no settable CSS properties" - person J Atkin; 22.04.2015