JavaFX 场景/背景颜色:如何更改?

发布于 2025-01-11 06:28:59 字数 8267 浏览 4 评论 0原文

如何更改该场景的背景颜色?我缺少什么?我尝试了以下操作:

此命令实际上解决了/没有错误,但它不会改变颜色。
scene.setFill(Color.GRAY);

此命令还可以解决/没有错误,但也不会更改颜色。
场景 scene = new Scene(pane, 250, 250, Color.GRAY);

感谢您的回复。

代码:==================================================== === ……

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.text.Text;


public class DisplayResizableClock extends Application {
    @Override // Override the start method in the Application class
    public void start(Stage primaryStage) {
        // Create a clock and a label
        ClockPane2 clock = new ClockPane2();
        //clock.setF;

        String timeString = clock.getHour() + ":" + clock.getMinute()
                + ":" + clock.getSecond();
        Label lblCurrentTime = new Label(timeString);

        // Place clock and label in border pane
        BorderPane pane = new BorderPane();
        pane.setCenter(clock);
        pane.setBottom(lblCurrentTime);
        BorderPane.setAlignment(lblCurrentTime, Pos.TOP_CENTER);

        // Create a scene and place the pane in the stage
        Scene scene = new Scene(pane, 250, 250);
        scene.setFill(Color.GRAY);
        primaryStage.setTitle("Display Resizable Clock"); // Set the stage title===========
        primaryStage.setScene(scene); // Place the scene in the stage
        primaryStage.show(); // Display the stage

        pane.widthProperty().addListener(ov ->
                clock.setWidth(pane.getWidth())
        );

        pane.heightProperty().addListener(ov ->
                clock.setHeight(pane.getHeight())
        );
    }

    /**
     * The main method is only needed for the IDE with limited
     * JavaFX support. Not needed for running from the command line.
     */
    public static void main(String[] args) {
        launch(args);
    }
}

//=====================

class ClockPane2 extends Pane {
    private int hour;
    private int minute;
    private int second;

    /** Construct a default clock with the current time*/
    public ClockPane2() {
        setCurrentTime();
    }

    /** Construct a clock with specified hour, minute, and second */
    public ClockPane2(int hour, int minute, int second) {
        this.hour = hour;
        this.minute = minute;
        this.second = second;
    }

    /** Return hour */
    public int getHour() {
        return hour;
    }

    /** Set a new hour */
    public void setHour(int hour) {
        this.hour = hour;
        paintClock();
    }

    /** Return minute */
    public int getMinute() {
        return minute;
    }

    /** Set a new minute */
    public void setMinute(int minute) {
        this.minute = minute;
        paintClock();
    }

    /** Return second */
    public int getSecond() {
        return second;
    }

    /** Set a new second */
    public void setSecond(int second) {
        this.second = second;
        paintClock();
    }

    /* Set the current time for the clock */
    public void setCurrentTime() {
        // Construct a calendar for the current date and time
        Calendar calendar = new GregorianCalendar();

        // Set current hour, minute and second
        this.hour = calendar.get(Calendar.HOUR_OF_DAY);
        this.minute = calendar.get(Calendar.MINUTE);
        this.second = calendar.get(Calendar.SECOND);

        paintClock(); // Repaint the clock
    }

    /** Paint the clock */
    private void paintClock() {
        // Initialize clock parameters
        double clockRadius =
                Math.min(getWidth(), getHeight()) * 0.8 * 0.5;
        double centerX = getWidth() / 2;
        double centerY = getHeight() / 2;

        // Draw circle
        Circle circle = new Circle(centerX, centerY, clockRadius);
        circle.setFill(Color.YELLOW);  //=====changed color==============
        circle.setStroke(Color.BLACK);
        Text t1 = new Text(centerX - 5, centerY - clockRadius + 12, "12");
        Text t2 = new Text(centerX - clockRadius + 3, centerY + 5, "9");
        Text t3 = new Text(centerX + clockRadius - 10, centerY + 3, "3");
        Text t4 = new Text(centerX - 3, centerY + clockRadius - 3, "6");

        // Draw second hand
        double sLength = clockRadius * 0.8;
        double secondX = centerX + sLength *
                Math.sin(second * (2 * Math.PI / 60));
        double secondY = centerY - sLength *
                Math.cos(second * (2 * Math.PI / 60));
        Line sLine = new Line(centerX, centerY, secondX, secondY);
        sLine.setStroke(Color.RED);

        // Draw minute hand
        double mLength = clockRadius * 0.65;
        double xMinute = centerX + mLength *
                Math.sin(minute * (2 * Math.PI / 60));
        double minuteY = centerY - mLength *
                Math.cos(minute * (2 * Math.PI / 60));
        Line mLine = new Line(centerX, centerY, xMinute, minuteY);
        mLine.setStroke(Color.BROWN); //changed color to brown======================

        // Draw hour hand
        double hLength = clockRadius * 0.5;
        double hourX = centerX + hLength *
                Math.sin((hour % 12 + minute / 60.0) * (2 * Math.PI / 12));
        double hourY = centerY - hLength *
                Math.cos((hour % 12 + minute / 60.0) * (2 * Math.PI / 12));
        Line hLine = new Line(centerX, centerY, hourX, hourY);
        hLine.setStroke(Color.GREEN);

        getChildren().clear(); // Clear the pane
        getChildren().addAll(circle, t1, t2, t3, t4, sLine, mLine, hLine);

        Group ticks = new Group();//create tick hands============================
        Group numbers = new Group(); //create numbers==========================

        // creating the big ticks (12)===============================

        for (int i = 0; i < 12; i++) {
            /*creating a line with a width of 10 and placing at 'clockRadius'
             distance away from center*/
            Line tick = new Line(0, clockRadius, 0, clockRadius - 10);
            tick.setTranslateX(centerX);
            tick.setTranslateY(centerY);
            //applying proper rotation to rotate the tick
            tick.getTransforms().add(new Rotate(i * (360 / 12)));
            //adding to ticks group
            ticks.getChildren().add(tick);

        }

        // creating the small ticks=========================================

        for (int i = 0; i < 60; i++) {
            //lines will have a width of 5
            Line tick = new Line(0, clockRadius, 0, clockRadius - 5);
            tick.setTranslateX(centerX);
            tick.setTranslateY(centerY);
            tick.getTransforms().add(new Rotate(i * (360 / 60)));
            ticks.getChildren().add(tick);
        }

        // creating the numbers==================================================

        int num = 12; // starting with 12
        for (int i = 0; i < 12; i++) {
            //finding proper position x and y by applying the equation
            double x = centerX + (clockRadius - 20) * Math.sin((i % 12) * (2 * Math.PI / 12));
            double y = centerY - (clockRadius - 20) * Math.cos((i % 12) * (2 * Math.PI / 12));
            //defining a text with hour label, (x-5 and y+5 are used to align text
            //in proper position, considering font height & width)
            Text t = new Text(x - 5, y + 5, "" + num);
            numbers.getChildren().add(t);
            num++;
            if (num > 12) {
                num = 1;
            }

        }

        // adding ticks and numbers======================
        getChildren().add(ticks);
        getChildren().add(numbers);

    }

    @Override
    public void setWidth(double width) {
        super.setWidth(width);
        paintClock();
    }

    @Override
    public void setHeight(double height) {
        super.setHeight(height);
        paintClock();
    }
}

How do I change the background color of this scene? what am I missing? I tried the following:

This command actually resolves / has no error BUT it doesn't change the color.
scene.setFill(Color.GRAY);

This command also resolves / has no error but it also doesn't change the color.
Scene scene = new Scene(pane, 250, 250, Color.GRAY);

Thank you for your response.

CODE: ===================================================
...

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.text.Text;


public class DisplayResizableClock extends Application {
    @Override // Override the start method in the Application class
    public void start(Stage primaryStage) {
        // Create a clock and a label
        ClockPane2 clock = new ClockPane2();
        //clock.setF;

        String timeString = clock.getHour() + ":" + clock.getMinute()
                + ":" + clock.getSecond();
        Label lblCurrentTime = new Label(timeString);

        // Place clock and label in border pane
        BorderPane pane = new BorderPane();
        pane.setCenter(clock);
        pane.setBottom(lblCurrentTime);
        BorderPane.setAlignment(lblCurrentTime, Pos.TOP_CENTER);

        // Create a scene and place the pane in the stage
        Scene scene = new Scene(pane, 250, 250);
        scene.setFill(Color.GRAY);
        primaryStage.setTitle("Display Resizable Clock"); // Set the stage title===========
        primaryStage.setScene(scene); // Place the scene in the stage
        primaryStage.show(); // Display the stage

        pane.widthProperty().addListener(ov ->
                clock.setWidth(pane.getWidth())
        );

        pane.heightProperty().addListener(ov ->
                clock.setHeight(pane.getHeight())
        );
    }

    /**
     * The main method is only needed for the IDE with limited
     * JavaFX support. Not needed for running from the command line.
     */
    public static void main(String[] args) {
        launch(args);
    }
}

//=====================

class ClockPane2 extends Pane {
    private int hour;
    private int minute;
    private int second;

    /** Construct a default clock with the current time*/
    public ClockPane2() {
        setCurrentTime();
    }

    /** Construct a clock with specified hour, minute, and second */
    public ClockPane2(int hour, int minute, int second) {
        this.hour = hour;
        this.minute = minute;
        this.second = second;
    }

    /** Return hour */
    public int getHour() {
        return hour;
    }

    /** Set a new hour */
    public void setHour(int hour) {
        this.hour = hour;
        paintClock();
    }

    /** Return minute */
    public int getMinute() {
        return minute;
    }

    /** Set a new minute */
    public void setMinute(int minute) {
        this.minute = minute;
        paintClock();
    }

    /** Return second */
    public int getSecond() {
        return second;
    }

    /** Set a new second */
    public void setSecond(int second) {
        this.second = second;
        paintClock();
    }

    /* Set the current time for the clock */
    public void setCurrentTime() {
        // Construct a calendar for the current date and time
        Calendar calendar = new GregorianCalendar();

        // Set current hour, minute and second
        this.hour = calendar.get(Calendar.HOUR_OF_DAY);
        this.minute = calendar.get(Calendar.MINUTE);
        this.second = calendar.get(Calendar.SECOND);

        paintClock(); // Repaint the clock
    }

    /** Paint the clock */
    private void paintClock() {
        // Initialize clock parameters
        double clockRadius =
                Math.min(getWidth(), getHeight()) * 0.8 * 0.5;
        double centerX = getWidth() / 2;
        double centerY = getHeight() / 2;

        // Draw circle
        Circle circle = new Circle(centerX, centerY, clockRadius);
        circle.setFill(Color.YELLOW);  //=====changed color==============
        circle.setStroke(Color.BLACK);
        Text t1 = new Text(centerX - 5, centerY - clockRadius + 12, "12");
        Text t2 = new Text(centerX - clockRadius + 3, centerY + 5, "9");
        Text t3 = new Text(centerX + clockRadius - 10, centerY + 3, "3");
        Text t4 = new Text(centerX - 3, centerY + clockRadius - 3, "6");

        // Draw second hand
        double sLength = clockRadius * 0.8;
        double secondX = centerX + sLength *
                Math.sin(second * (2 * Math.PI / 60));
        double secondY = centerY - sLength *
                Math.cos(second * (2 * Math.PI / 60));
        Line sLine = new Line(centerX, centerY, secondX, secondY);
        sLine.setStroke(Color.RED);

        // Draw minute hand
        double mLength = clockRadius * 0.65;
        double xMinute = centerX + mLength *
                Math.sin(minute * (2 * Math.PI / 60));
        double minuteY = centerY - mLength *
                Math.cos(minute * (2 * Math.PI / 60));
        Line mLine = new Line(centerX, centerY, xMinute, minuteY);
        mLine.setStroke(Color.BROWN); //changed color to brown======================

        // Draw hour hand
        double hLength = clockRadius * 0.5;
        double hourX = centerX + hLength *
                Math.sin((hour % 12 + minute / 60.0) * (2 * Math.PI / 12));
        double hourY = centerY - hLength *
                Math.cos((hour % 12 + minute / 60.0) * (2 * Math.PI / 12));
        Line hLine = new Line(centerX, centerY, hourX, hourY);
        hLine.setStroke(Color.GREEN);

        getChildren().clear(); // Clear the pane
        getChildren().addAll(circle, t1, t2, t3, t4, sLine, mLine, hLine);

        Group ticks = new Group();//create tick hands============================
        Group numbers = new Group(); //create numbers==========================

        // creating the big ticks (12)===============================

        for (int i = 0; i < 12; i++) {
            /*creating a line with a width of 10 and placing at 'clockRadius'
             distance away from center*/
            Line tick = new Line(0, clockRadius, 0, clockRadius - 10);
            tick.setTranslateX(centerX);
            tick.setTranslateY(centerY);
            //applying proper rotation to rotate the tick
            tick.getTransforms().add(new Rotate(i * (360 / 12)));
            //adding to ticks group
            ticks.getChildren().add(tick);

        }

        // creating the small ticks=========================================

        for (int i = 0; i < 60; i++) {
            //lines will have a width of 5
            Line tick = new Line(0, clockRadius, 0, clockRadius - 5);
            tick.setTranslateX(centerX);
            tick.setTranslateY(centerY);
            tick.getTransforms().add(new Rotate(i * (360 / 60)));
            ticks.getChildren().add(tick);
        }

        // creating the numbers==================================================

        int num = 12; // starting with 12
        for (int i = 0; i < 12; i++) {
            //finding proper position x and y by applying the equation
            double x = centerX + (clockRadius - 20) * Math.sin((i % 12) * (2 * Math.PI / 12));
            double y = centerY - (clockRadius - 20) * Math.cos((i % 12) * (2 * Math.PI / 12));
            //defining a text with hour label, (x-5 and y+5 are used to align text
            //in proper position, considering font height & width)
            Text t = new Text(x - 5, y + 5, "" + num);
            numbers.getChildren().add(t);
            num++;
            if (num > 12) {
                num = 1;
            }

        }

        // adding ticks and numbers======================
        getChildren().add(ticks);
        getChildren().add(numbers);

    }

    @Override
    public void setWidth(double width) {
        super.setWidth(width);
        paintClock();
    }

    @Override
    public void setHeight(double height) {
        super.setHeight(height);
        paintClock();
    }
}

...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜是你 2025-01-18 06:28:59

我也查遍了互联网以找出问题所在。但是,我设法找到一种方法来改变这种情况。

不要使用场景的 setfill() 方法,而是使用节点的 setStyle() 方法(在本例中为 BorderPane)。

例如,如果您使用类似的内容:

pane.setStyle("-fx-background-color: grey;");

它应该将场景内的窗格的颜色设置为灰色。最好的部分是该命令可以放置在设置场景之前或之后。

以下是使用命令获取黑色背景后我的场景之一的图像作为示例:
输入图片此处描述

I have looked all over the internet to figure out what the issue was as well. But, I managed to find a way to change the scene.

Instead of using the setfill() method for the scene, use the node's setStyle() method (in this case BorderPane).

For example, if you use something like:

pane.setStyle("-fx-background-color: grey;");

It should set the color of the pane, which is inside the scene, to grey. The best part is that the command can be placed before or after setting the scene to work.

Here is an image of one of my scenes after using the command to get a black background as an example:
enter image description here

奢望 2025-01-18 06:28:59

如果您可以使用 Pane 而不是 BorderPane 那么
你可以完成添加,

pane.setBackground(new Background(new BackgroundFill(Color.GRAY, null, null)));

If you can use Pane instead of BorderPane then
You could accomplish adding,

pane.setBackground(new Background(new BackgroundFill(Color.GRAY, null, null)));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文