首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaFX场景/背景色:如何改变?

JavaFX场景/背景色:如何改变?
EN

Stack Overflow用户
提问于 2022-03-02 19:25:39
回答 1查看 899关注 0票数 2

我如何改变这个场景的背景色?我遗漏了什么?我尝试了以下几点:

这个命令实际上解析/没有错误,但是它不改变颜色。

scene.setFill(Color.GRAY);

此命令还解决/没有错误,但它也不改变颜色。

场景场景=新场景(窗格,250,250,Color.GRAY);

感谢您的回复。

代码:=================================================== ..。

代码语言:javascript
运行
复制
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();
    }
}

..。

EN

回答 1

Stack Overflow用户

发布于 2022-09-09 23:14:15

我在互联网上到处寻找,想弄清楚这个问题到底是什么。但是,我设法改变了局面。

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

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

代码语言:javascript
运行
复制
pane.setStyle("-fx-background-color: grey;");

它应该将位于场景中的窗格的颜色设置为灰色。最重要的是,命令可以放在设置场景之前或之后开始工作。

下面是我使用命令获取黑色背景作为示例后的一个场景的图像:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71328159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档