有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java可以将窗格的高度/宽度绑定到BorderPane的中心节点吗?

我有一个任务,要求我扩展pane类,然后在其上添加一个矩形。然后我填充矩形,并使用一些按钮来更改矩形的颜色。我将我的扩展窗格类添加到边框窗格的中心节点,但我设想矩形占据整个窗格,并绑定到窗格的高度和宽度,然后窗格又占据边框窗格的整个中心窗格,并绑定到中心窗格的高度和宽度。我应该制作一个窗格,然后将扩展窗格添加到窗格中,然后将窗格添加到边框窗格的中心窗格中吗?以下是我的全部代码。下面是我得到的图片

enter image description here

package homework;

import javafx.scene.shape.*;

import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class ColorSample extends Application{
    @Override
    public void start (Stage primaryStage) {
        //Create border pane
        BorderPane bp = new BorderPane();
        
        //Create saturation buttons
        Button btnMSat = new Button("More Saturated");
        Button btnLSat = new Button("Less Saturated");
        
        //Create hue buttons
        Button btnHueU = new Button("Hue Up");
        Button btnHueD = new Button("Hue Down");
        
        //Create Darker/Brighter buttons
        Button btnDark = new Button("Darker");
        Button btnBright = new Button("Brighter");
        
        //Create Top and bottom HBoxes
        HBox THBox = new HBox(10);
        THBox.setAlignment(Pos.CENTER);
        HBox BHBox = new HBox(10);
        BHBox.setAlignment(Pos.CENTER);
        
        //Create ColorPane
        Color color = Color.MEDIUMBLUE;
        ColorPane cp = new ColorPane(color);
        cp.setColor(color);
        //Set Events
        //More Saturation Clicked
        btnMSat.setOnAction(e->{
            cp.setColor(cp.moreSaturation(cp.getColor()));
        });
        //Less Saturation Clicked
        btnLSat.setOnAction(e->{
            cp.setColor(cp.lessSaturation(cp.getColor()));
        });
        //Hue Up Clicked
        btnHueU.setOnAction(e->{
            cp.setHue(cp.getColor(), 30);
        });
        //Hue Down Clicked
        btnHueD.setOnAction(e->{
            cp.setHue(cp.getColor(), -30);
        });
        //Darker Clicked
        btnDark.setOnAction(e->{
            cp.darker(cp.getColor());
        });
        //Brighter Clicked
        btnDark.setOnAction(e->{
            cp.brighter(cp.getColor());
        });
        
        //Add Saturation Buttons to Top HBox
        THBox.getChildren().addAll(btnMSat, btnLSat);
        bp.setTop(THBox);
        //Add Darker/Lighter buttons to Bottom HBox
        BHBox.getChildren().addAll(btnDark, btnBright);
        bp.setBottom(BHBox);
        //Create right side VBox
        VBox RVBox = new VBox(10);
        RVBox.setAlignment(Pos.CENTER);
        //Add Hue buttons to right side VBox
        RVBox.getChildren().addAll(btnHueU, btnHueD);
        bp.setPrefSize(450, 325);
        bp.setRight(RVBox);
        //Add ColorPane to Border Panel
        bp.setCenter(cp);
        BorderPane.setAlignment(cp, Pos.CENTER);
        
        
        //Create scene and add border pane to it
        Scene scene = new Scene(bp, 525, 450);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    class ColorPane extends Pane {
        Rectangle rectangle = new Rectangle();
            
    
        ColorPane() {
            //Set properties
            rectangle.setX(0);
            rectangle.setY(0);
            //Bind width and height
            rectangle.setWidth(USE_COMPUTED_SIZE);
            rectangle.setHeight(USE_COMPUTED_SIZE);
            getChildren().add(rectangle);
        }
        
        ColorPane(Color c) {
            //Set properties
            rectangle.setX(0);
            rectangle.setY(0);
            rectangle.setWidth(450);
            rectangle.setHeight(450);
            //Bind width and height
            rectangle.widthProperty().bind(widthProperty());
            rectangle.heightProperty().bind(heightProperty());
            setColor(c);
            rectangle.setStroke(c);
            rectangle.setFill(c);
            getChildren().add(rectangle);
        }   
        
        @Override
        public void setWidth(double w) {
            super.setWidth(w);
            
        }
        
        @Override
        public void setHeight(double h) {
            super.setWidth(h);
            
        }
        
        public Color setHue(Color color, double h) {
            double newHue = 0;
            
            if(color.getHue() + h >= 360)
                newHue = 360;
            else if (color.getBlue() + h <= 0)
                newHue = 0;
            else
                newHue+=h;
            
            Color output = Color.hsb(newHue, color.getSaturation(),
                    color.getBrightness(), color.getOpacity());
            
            return output;
        }
        
        public Color moreSaturation(Color color) {
            double newSat = 0;
            
            if (Math.pow(color.getSaturation(), 2) > 1)
                newSat = 1;
            else
                newSat = Math.pow(color.getSaturation(), 2);
            
            Color output = Color.hsb(color.getHue(), newSat,
                    color.getBrightness(), color.getOpacity());
            
            return output;
        }
        
        public Color lessSaturation(Color color) {
            double newSat = 0;
            
            if (Math.sqrt(color.getSaturation()) > 0)
                newSat = Math.sqrt(color.getSaturation());
            
            Color output = Color.hsb(color.getHue(), newSat,
                    color.getBrightness(), color.getOpacity());
            
            return output;
        }
        
        public Color darker(Color color) {
            double brightness = 0;
            if(Math.pow(color.getBrightness(), 2) >=1)
                brightness =1;
            else
                brightness = Math.pow(color.getBrightness(), 2);
            Color output = Color.hsb(color.getHue(), color.getSaturation(),
                    brightness, color.getOpacity());
            return output;
        }
        
        public Color brighter(Color color) {
            double brightness = 0;
            if(Math.sqrt(color.getBrightness())>0)
                brightness = Math.sqrt(color.getBrightness());
            
            Color output = Color.hsb(color.getHue(), color.getSaturation(),
                    brightness, color.getOpacity());
            
            return output;
        }
        
        public Color getColor() {
            return (Color) rectangle.getFill();
        }
        
        public void setColor(Color c) {
            rectangle.setStroke(c);
            rectangle.setFill(c);
        }
    }
    
    public static void main(String[] args) {
        Application.launch(args);
    }
}

共 (2) 个答案

  1. # 1 楼答案

    好的,在ColorPane构造函数中,我注释掉了绑定高度和宽度的线条,所以现在矩形出现了,但是当矩形从窗格的坐标0,0开始时(请参见构造函数),ColorPane本身并没有填充边框窗格的中心窗格。下面是截图和代码

    Rectangle needs to fill center pane, not overlap bottom pane

    package homework;
    
    import javafx.scene.shape.*;
    
    import javafx.application.Application;
    import javafx.beans.property.DoubleProperty;
    import javafx.beans.property.Property;
    import javafx.beans.property.SimpleDoubleProperty;
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.Pane;
    import javafx.scene.layout.Region;
    import javafx.scene.layout.VBox;
    import javafx.scene.paint.Color;
    import javafx.stage.Stage;
    
    public class ColorSample extends Application{
        @Override
        public void start (Stage primaryStage) {
            //Create border pane
            BorderPane bp = new BorderPane();
            
            //Create saturation buttons
            Button btnMSat = new Button("More Saturated");
            Button btnLSat = new Button("Less Saturated");
            
            //Create hue buttons
            Button btnHueU = new Button("Hue Up");
            Button btnHueD = new Button("Hue Down");
            
            //Create Darker/Brighter buttons
            Button btnDark = new Button("Darker");
            Button btnBright = new Button("Brighter");
            
            //Create Top and bottom HBoxes
            HBox THBox = new HBox(10);
            THBox.setAlignment(Pos.CENTER);
            HBox BHBox = new HBox(10);
            BHBox.setAlignment(Pos.CENTER);
            
            //Create ColorPane
            Color color = Color.MEDIUMBLUE;
            ColorPane cp = new ColorPane(color);
            cp.setColor(color);
            //Set Events
            //More Saturation Clicked
            btnMSat.setOnAction(e->{
                cp.setColor(cp.moreSaturation(cp.getColor()));
            });
            //Less Saturation Clicked
            btnLSat.setOnAction(e->{
                cp.setColor(cp.lessSaturation(cp.getColor()));
            });
            //Hue Up Clicked
            btnHueU.setOnAction(e->{
                cp.setHue(cp.getColor(), 30);
            });
            //Hue Down Clicked
            btnHueD.setOnAction(e->{
                cp.setHue(cp.getColor(), -30);
            });
            //Darker Clicked
            btnDark.setOnAction(e->{
                cp.darker(cp.getColor());
            });
            //Brighter Clicked
            btnDark.setOnAction(e->{
                cp.brighter(cp.getColor());
            });
            
            //Add Saturation Buttons to Top HBox
            THBox.getChildren().addAll(btnMSat, btnLSat);
            bp.setTop(THBox);
            //Add Darker/Lighter buttons to Bottom HBox
            BHBox.getChildren().addAll(btnDark, btnBright);
            bp.setBottom(BHBox);
            //Create right side VBox
            VBox RVBox = new VBox(10);
            RVBox.setAlignment(Pos.CENTER);
            //Add Hue buttons to right side VBox
            RVBox.getChildren().addAll(btnHueU, btnHueD);
            //bp.setPrefSize(450, 325);
            bp.setRight(RVBox);
            //Add ColorPane to Center Border Panel
            //Insets inset = new Insets(5,5,5,5);
            //bp.setPadding(inset);
            //bp.setAlignment(cp, Pos.CENTER);
            bp.setCenter(cp);
            
            
            //Create scene and add border pane to it
            Scene scene = new Scene(bp, 525, 450);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
        
        class ColorPane extends Pane {
            Rectangle rectangle = new Rectangle();
                
        
            ColorPane() {
                //Set properties
                rectangle.setX(0);
                rectangle.setY(0);
                //Bind width and height
                /*rectangle.setWidth(USE_COMPUTED_SIZE);
                rectangle.setHeight(USE_COMPUTED_SIZE);*/
                getChildren().add(rectangle);
            }
            
            ColorPane(Color c) {
                //Set properties
                rectangle.setX(0);
                rectangle.setY(0);
                rectangle.setWidth(450);
                rectangle.setHeight(450);
                //Bind width and height
                /*rectangle.widthProperty().bind(widthProperty());
                rectangle.heightProperty().bind(heightProperty());*/
                setColor(c);
                rectangle.setStroke(c);
                rectangle.setFill(c);
                getChildren().add(rectangle);
            }   
            
            @Override
            public void setWidth(double w) {
                super.setWidth(w);
                
            }
            
            @Override
            public void setHeight(double h) {
                super.setWidth(h);
                
            }
            
            public Color setHue(Color color, double h) {
                double newHue = 0;
                
                if(color.getHue() + h >= 360)
                    newHue = 360;
                else if (color.getBlue() + h <= 0)
                    newHue = 0;
                else
                    newHue+=h;
                
                Color output = Color.hsb(newHue, color.getSaturation(),
                        color.getBrightness(), color.getOpacity());
                
                return output;
            }
            
            public Color moreSaturation(Color color) {
                double newSat = 0;
                
                if (Math.pow(color.getSaturation(), 2) > 1)
                    newSat = 1;
                else
                    newSat = Math.pow(color.getSaturation(), 2);
                
                Color output = Color.hsb(color.getHue(), newSat,
                        color.getBrightness(), color.getOpacity());
                
                return output;
            }
            
            public Color lessSaturation(Color color) {
                double newSat = 0;
                
                if (Math.sqrt(color.getSaturation()) > 0)
                    newSat = Math.sqrt(color.getSaturation());
                
                Color output = Color.hsb(color.getHue(), newSat,
                        color.getBrightness(), color.getOpacity());
                
                return output;
            }
            
            public Color darker(Color color) {
                double brightness = 0;
                if(Math.pow(color.getBrightness(), 2) >=1)
                    brightness =1;
                else
                    brightness = Math.pow(color.getBrightness(), 2);
                Color output = Color.hsb(color.getHue(), color.getSaturation(),
                        brightness, color.getOpacity());
                return output;
            }
            
            public Color brighter(Color color) {
                double brightness = 0;
                if(Math.sqrt(color.getBrightness())>0)
                    brightness = Math.sqrt(color.getBrightness());
                
                Color output = Color.hsb(color.getHue(), color.getSaturation(),
                        brightness, color.getOpacity());
                
                return output;
            }
            
            public Color getColor() {
                return (Color) rectangle.getFill();
            }
            
            public void setColor(Color c) {
                rectangle.setStroke(c);
                rectangle.setFill(c);
            }
        }
        
        public static void main(String[] args) {
            Application.launch(args);
        }
    }
    
  2. # 2 楼答案

    实际上,将颜色窗格的添加设置为BorderPane中心节点的左上角,然后将其添加到中心:

    bp.setAlignment(cp, Pos.TOP_LEFT);
    bp.setCenter(cp);
    

    仍在努力找出调整大小时如何处理行为,但这要好得多