在 JavaFX 中绘制形状

Painting shapes in JavaFX

我创建了一个简单的绘图程序,允许用户在 4 种形状(线、圆、矩形、椭圆)之间进行选择,用户可以更改宽度高度和笔划宽度,他可以保存他所做的设计,撤消然后重做,用户还可以选择笔划类型(实线或虚线),我遇到了一个问题,当用户选择虚线作为笔划类型时,我希望他能够选择笔划的粗细,它有效实线非常好,但虚线只是增加或减少虚线的数量,关于如何固定虚线的数量和增加虚线的粗细的任何想法。

注意:我在代码中使用矩形来使代码变小。

代码如下:

import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Stack;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.embed.swing.SwingFXUtils;
import javafx.geometry.Insets;
import javafx.scene.Cursor;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.scene.text.Font;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javax.imageio.ImageIO;

public class GFG extends Application {

@Override
public void start(Stage primaryStage) {

Image image2 = new 
Image("C:\Users\Mhamd\Desktop\laol\src\resources\pngegg.png",100,100,false,false);
    ImageView view2 = new ImageView(image2);
    view2.setFitHeight(40);
    view2.setPreserveRatio(true);
ToggleButton rectbtn = new ToggleButton();
rectbtn.setGraphic(view2);
ToggleButton[] toolsArr = {rectbtn};

    ToggleGroup tools = new ToggleGroup();

    for (ToggleButton tool : toolsArr) {
        tool.setMinWidth(50);
        tool.setToggleGroup(tools);
        tool.setCursor(Cursor.HAND);
    }
ColorPicker cpLine = new ColorPicker(Color.BLACK);
    ColorPicker cpFill = new ColorPicker(Color.TRANSPARENT);

    TextField textWidth = new TextField("32");
    TextField textHeight = new TextField("32");
    TextField contouring = new TextField("2");
Label line_color = new Label("Line Color");
    Label fill_color = new Label("Fill Color");
    Label line_width = new Label("3.0");
    Label imgWidth = new Label("Width");
    Label imgHeight = new Label("Height");
String week_days[] =
            { "Solid", "Dotted"};
    ChoiceBox choiceBox = new ChoiceBox(FXCollections
            .observableArrayList(week_days));
VBox btns = new VBox(10);
    btns.getChildren().addAll(imgWidth,textWidth,imgHeight,textHeight, line_color, cpLine, 
fill_color, cpFill, line_width, contouring,choiceBox);
    btns.setPadding(new Insets(5));
    btns.setStyle("-fx-background-color: #999");
    btns.setPrefWidth(100);
Canvas canvas = new Canvas(1080, 790);
    GraphicsContext gc;
    gc = canvas.getGraphicsContext2D();
    gc.setLineWidth(1);
Rectangle rect = new Rectangle();
canvas.setOnMouseClicked(e->{
        if(rectbtn.isSelected()){
            double widthSize = Double.parseDouble(textWidth.getText());
            double heightSize = Double.parseDouble(textHeight.getText());
            double strokeWidth = Double.parseDouble(contouring.getText());
            gc.setStroke(cpLine.getValue());
            if(choiceBox.getSelectionModel().isSelected(0)){
                gc.setLineWidth(strokeWidth);
            }
            else if(choiceBox.getSelectionModel().isSelected(1)){
                //gc.setLineDashes(strokeWidth);
                gc.setLineDashOffset(10);
            }
            gc.setFill(cpFill.getValue());
            rect.setX(e.getX() - 20);
            rect.setY(e.getY() - 20);
            rect.setWidth(widthSize);
            rect.setHeight(heightSize);
            gc.fillRect(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
            gc.strokeRect(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
            undoHistory.push(new Rectangle(rect.getX(), rect.getY(), rect.getWidth(), 
rect.getHeight()));
        }
});
}
public static void main(String[] args) {
    launch(args);
}
}

您还必须为虚线设置宽度。将线破折号设置为线宽没有多大意义,除非您想要看起来更像虚线的东西。并且您仅在特定情况下需要破折号偏移量,但一般情况下不需要。