繁体   English   中英

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

[英]JavaFX Scene/background Color: How to Change?

如何更改此场景的背景颜色? 我错过了什么? 我尝试了以下方法:

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

这个命令也解决了/没有错误,但它也不会改变颜色。
场景场景 = 新场景(窗格、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();
    }
}

...

我已经查看了整个互联网以找出问题所在。 但是,我设法找到了改变场景的方法。

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

例如,如果您使用以下内容:

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

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

这是我使用命令获取黑色背景后的一个场景的图像: 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM