实现一个小型的图形绘制画板,包括直线、矩形、椭圆、多边形等基本图形

//javafx用jdk8版本
import javafx.application.Application;
import javafx.collections.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.*;
import javafx.event.*;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.input.MouseEvent;
import javafx.scene.shape.*;
import javax.swing.JOptionPane;
import javafx.scene.text.Text;
public class Java extends Application
{
	private double x1,x2,y1,y2;
	private Pane pane=new Pane();
	@Override
	public void start(Stage stage)
	{
		MenuBar menub=new MenuBar();
		Menu menu=new Menu("菜单");
		MenuItem Line=new MenuItem("直线");
		MenuItem recentage=new MenuItem("矩形");
		MenuItem ellipse=new MenuItem("椭圆");
		MenuItem Circle=new MenuItem("正圆");
		MenuItem polygon=new MenuItem("多边形");
		MenuItem paint=new MenuItem("画笔");
		menu.getItems().addAll(Line,recentage,ellipse,Circle,polygon,paint);
		Menu tool=new Menu("工具");
		Menu color=new Menu("边框颜色");
		Menu fill=new Menu("填充颜色");
		RadioMenuItem black=new RadioMenuItem("黑色");
		RadioMenuItem white=new RadioMenuItem("白色");
		RadioMenuItem red=new RadioMenuItem("红色");
		RadioMenuItem orange=new RadioMenuItem("橙色");
		RadioMenuItem yellow=new RadioMenuItem("黄色");
		RadioMenuItem green=new RadioMenuItem("绿色");
		RadioMenuItem cany=new RadioMenuItem("青色");
		RadioMenuItem blue=new RadioMenuItem("蓝色");
		RadioMenuItem purple=new RadioMenuItem("紫色");
		color.getItems().addAll(black,white,red,orange,yellow,green,cany,blue,purple);
		RadioMenuItem fblack=new RadioMenuItem("黑色");
		RadioMenuItem fwhite=new RadioMenuItem("白色");
		RadioMenuItem fred=new RadioMenuItem("红色");
		RadioMenuItem forange=new RadioMenuItem("橙色");
		RadioMenuItem fyellow=new RadioMenuItem("黄色");
		RadioMenuItem fgreen=new RadioMenuItem("绿色");
		RadioMenuItem fcany=new RadioMenuItem("青色");
		RadioMenuItem fblue=new RadioMenuItem("蓝色");
		RadioMenuItem fpurple=new RadioMenuItem("紫色");
		fill.getItems().addAll(fblack,fwhite,fred,forange,fyellow,fgreen,fcany,fblue,fpurple);
		Menu bond=new Menu("笔触大小");
		MenuItem little=new MenuItem("小");
		MenuItem middle=new MenuItem("中");
		MenuItem big=new MenuItem("大");
		MenuItem custom=new MenuItem("自定义");
		bond.getItems().addAll(little,middle,big,custom);
		tool.getItems().addAll(color,bond,fill);
		menub.getMenus().addAll(menu,tool);
		BorderPane bp=new BorderPane();
		bp.setTop(menub);
		bp.setCenter(pane);
		pane.setStyle("-fx-background-color:white");
		Line line=new Line(200,50,300,50);  
		Rectangle r=new Rectangle(200,50,100,50);
		Ellipse elli=new Ellipse(250,80,50,30);
		Circle circle=new Circle(250,80,30);
		Polygon pg=new Polygon();
		Alert alert=new Alert(AlertType.INFORMATION);
		alert.setTitle("错误");
		alert.setHeaderText(null);
		EventHandler<ActionEvent>MEHandler=new EventHandler<ActionEvent>()
		{
			public void handle(ActionEvent ae)
			{
				String name=((MenuItem) ae.getTarget()).getText();
				if(name.equals("直线")) {
					line.setStrokeWidth(2);
					line.setStroke(Color.BLACK);
					draggable(line);
					pane.getChildren().addAll(line);
				}
				if(name.equals("矩形")) {
					r.setStrokeWidth(2);
					r.setStroke(Color.BLACK);
					r.setFill(null);
					draggable(r);
					pane.getChildren().addAll(r);
				}
				if(name.equals("椭圆")) {
					elli.setStrokeWidth(2);
					elli.setStroke(Color.BLACK);
					elli.setFill(null);
					draggable(elli);
					pane.getChildren().addAll(elli);
				}
				if(name.equals("正圆")) {
					circle.setStrokeWidth(2);
					circle.setStroke(Color.BLACK);
					circle.setFill(null);
					draggable(circle);
					pane.getChildren().addAll(circle);
				}
				if(name.equals("多边形")) {
					pg.setFill(null);
					pg.setStroke(Color.BLACK);
					pg.setStrokeWidth(2);
					draggable(pg);
					ObservableList<Double>myList=pg.getPoints();
					double cx=200,cy=70,r=40;
					for(int i=0;i<6;i++) {
						myList.add(cx+r*Math.cos(2*i*Math.PI/6));
						myList.add(cy-r*Math.sin(2*i*Math.PI/6));
					}
					pane.getChildren().addAll(pg);
				}
			}
		};
		paint.setOnAction(ex->{
			pane.setOnMousePressed(e->handleMousePressed(e));
			pane.setOnMouseDragged(e->handleMouseDragged(e));
		});
		EventHandler<ActionEvent> ColorHandler=new EventHandler<ActionEvent>() {
			public void handle(ActionEvent ae) {
				String name=((MenuItem) ae.getTarget()).getText();
				if(name.equals("黑色")) {
					line.setStroke(Color.BLACK);
					r.setStroke(Color.BLACK);
					elli.setStroke(Color.BLACK);
					circle.setStroke(Color.BLACK);
					pg.setStroke(Color.BLACK);
				}
				if(name.equals("白色")) {
					line.setStroke(Color.WHITE);
					r.setStroke(Color.WHITE);
					elli.setStroke(Color.WHITE);
					circle.setStroke(Color.WHITE);
					pg.setStroke(Color.WHITE);
				}
				if(name.equals("红色")) {
					line.setStroke(Color.RED);
					r.setStroke(Color.RED);
					elli.setStroke(Color.RED);
					circle.setStroke(Color.RED);
					pg.setStroke(Color.RED);
				}
				if(name.equals("橙色")) {
					line.setStroke(Color.ORANGE);
					r.setStroke(Color.ORANGE);
					elli.setStroke(Color.ORANGE);
					circle.setStroke(Color.ORANGE);
					pg.setStroke(Color.ORANGE);
				}
				if(name.equals("黄色")) {
					line.setStroke(Color.YELLOW);
					r.setStroke(Color.YELLOW);
					elli.setStroke(Color.YELLOW);
					circle.setStroke(Color.YELLOW);
					pg.setStroke(Color.YELLOW);
				}
				if(name.equals("绿色")) {
					line.setStroke(Color.GREEN);
					r.setStroke(Color.GREEN);
					elli.setStroke(Color.GREEN);
					circle.setStroke(Color.GREEN);
					pg.setStroke(Color.GREEN);
				}
				if(name.equals("青色")) {
					line.setStroke(Color.CYAN);
					r.setStroke(Color.CYAN);
					elli.setStroke(Color.CYAN);
					circle.setStroke(Color.CYAN);
					pg.setStroke(Color.CYAN);
				}
				if(name.equals("蓝色")) {
					line.setStroke(Color.BLUE);
					r.setStroke(Color.BLUE);
					elli.setStroke(Color.BLUE);
					circle.setStroke(Color.BLUE);
					pg.setStroke(Color.BLUE);
				}
				if(name.equals("紫色")) {
					line.setStroke(Color.PURPLE);
					r.setStroke(Color.PURPLE);
					elli.setStroke(Color.PURPLE);
					circle.setStroke(Color.PURPLE);
					pg.setStroke(Color.PURPLE);
				}
			}
		};
		fblack.setOnAction(e->{
			r.setFill(Color.BLACK);
			elli.setFill(Color.BLACK);
			circle.setFill(Color.BLACK);
			pg.setFill(Color.BLACK);
		});
		fwhite.setOnAction(e->{
			r.setFill(Color.WHITE);
			elli.setFill(Color.WHITE);
			circle.setFill(Color.WHITE);
			pg.setFill(Color.WHITE);
		});
		fred.setOnAction(e->{
			r.setFill(Color.RED);
			elli.setFill(Color.RED);
			circle.setFill(Color.RED);
			pg.setFill(Color.RED);
		});
		forange.setOnAction(e->{
			r.setFill(Color.ORANGE);
			elli.setFill(Color.ORANGE);
			circle.setFill(Color.ORANGE);
			pg.setFill(Color.ORANGE);
		});
		fyellow.setOnAction(e->{
			r.setFill(Color.YELLOW);
			elli.setFill(Color.YELLOW);
			circle.setFill(Color.YELLOW);
			pg.setFill(Color.YELLOW);
		});
		fgreen.setOnAction(e->{
			r.setFill(Color.GREEN);
			elli.setFill(Color.GREEN);
			circle.setFill(Color.GREEN);
			pg.setFill(Color.GREEN);
		});
		fcany.setOnAction(e->{
			r.setFill(Color.CYAN);
			elli.setFill(Color.CYAN);
			circle.setFill(Color.CYAN);
			pg.setFill(Color.CYAN);
		});
		fpurple.setOnAction(e->{
			r.setFill(Color.PURPLE);
			elli.setFill(Color.PURPLE);
			circle.setFill(Color.PURPLE);
			pg.setFill(Color.PURPLE);
		});
		EventHandler<ActionEvent>FontHandler=new EventHandler<ActionEvent>()
		{
			public void handle(ActionEvent ae) {
				String name=((MenuItem) ae.getTarget()).getText();
				if(name.equals("小")) {
					line.setStrokeWidth(1);
					r.setStrokeWidth(1);
					elli.setStrokeWidth(1);;
					circle.setStrokeWidth(1);
					pg.setStrokeWidth(1);
				}
				if(name.equals("中")) {
					line.setStrokeWidth(5);
					r.setStrokeWidth(5);
					elli.setStrokeWidth(5);;
					circle.setStrokeWidth(5);
					pg.setStrokeWidth(5);
				}
				if(name.equals("大")) {
					line.setStrokeWidth(10);
					r.setStrokeWidth(10);
					elli.setStrokeWidth(10);;
					circle.setStrokeWidth(10);
					pg.setStrokeWidth(10);
				}
				if(name.equals("自定义")) {
					Stage pstage=new Stage();
					Text t=new Text("请输入笔触大小(单位:像素)");
					TextField tf=new TextField();
					tf.setPrefWidth(30);
					VBox vb=new VBox(10);
					vb.setAlignment(Pos.CENTER);
					Button button=new Button("确定");
					vb.getChildren().addAll(t,tf,button);
					StackPane spane=new StackPane();
					spane.setPadding(new Insets(50));
					spane.getChildren().addAll(vb);
					Scene scene=new Scene(spane,300,150);
					pstage.setTitle("自定义");
					pstage.setScene(scene);
					pstage.show();
					button.setOnAction(e->{
						if(!tf.getText().equals("")) {
							String n=tf.getText();
							int index=Integer.parseInt(n);
							line.setStrokeWidth(index);
							r.setStrokeWidth(index);
							elli.setStrokeWidth(index);;
							circle.setStrokeWidth(index);
							pg.setStrokeWidth(index);
						}else {
							alert.setContentText("大小不能为空");
							alert.showAndWait();
						}
						pstage.close();
					});
				}
			}
		};
		black.setOnAction(ColorHandler);
		white.setOnAction(ColorHandler);
		red.setOnAction(ColorHandler);
		orange.setOnAction(ColorHandler);
		yellow.setOnAction(ColorHandler);
		green.setOnAction(ColorHandler);
		cany.setOnAction(ColorHandler);
		blue.setOnAction(ColorHandler);
		purple.setOnAction(ColorHandler);
		Line.setOnAction(MEHandler);
		recentage.setOnAction(MEHandler);
		ellipse.setOnAction(MEHandler);
		Circle.setOnAction(MEHandler);
		polygon.setOnAction(MEHandler);
		little.setOnAction(FontHandler);
		middle.setOnAction(FontHandler);
		big.setOnAction(FontHandler);
		custom.setOnAction(FontHandler);
		Scene scene=new Scene(bp,500,400);
		stage.setTitle("画板");
		stage.setScene(scene);
		stage.show();
	}
	private void draggable(Node node)
	{
	    // 提示用户该结点可点击
	    node.addEventHandler(MouseEvent.MOUSE_ENTERED, event ->{
	    	 node.setCursor(Cursor.HAND);
	    });
	    node.addEventHandler(MouseEvent.MOUSE_EXITED, event ->node.setCursor(Cursor.DEFAULT));
	    // 提示用户该结点可拖拽
	    node.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> node.setCursor(Cursor.MOVE));
	    node.addEventHandler(MouseEvent.MOUSE_RELEASED, event -> {
	    	node.setCursor(Cursor.DEFAULT);
	    	Stage primarystage=new Stage();
			Text t=new Text("请输入对应的默认坐标");
			Label lx=new Label("X:");
			Label ly=new Label("Y:");
			TextField tx=new TextField();
			TextField ty=new TextField();
			tx.setPrefWidth(50);
			ty.setPrefWidth(50);
			Button  button=new Button("确定");
			HBox hb=new HBox(10);
			hb.setTranslateX(80);
			hb.getChildren().addAll(lx,tx,ly,ty);
			VBox vb=new VBox(10);
			vb.getChildren().addAll(t,hb,button);
			vb.setAlignment(Pos.CENTER);
			button.setOnAction(ev->{
				if(!(tx.getText().equals(""))&&!(ty.getText().equals(""))) {
					int x=Integer.parseInt(tx.getText());
					int y=Integer.parseInt(ty.getText());
					node.relocate(x, y);
				}
				primarystage.close();
			});
			primarystage.setTitle("默认位置参数");
			Scene scene=new Scene(vb,320,150);
			primarystage.setScene(scene);
			primarystage.show();
	    });
	    // 实现拖拽功能
	    node.addEventHandler(MouseEvent.MOUSE_DRAGGED, event -> {
	      double distanceX = event.getX();
	      double distanceY = event.getY();
	      double x = node.getLayoutX() + distanceX;
	      double y = node.getLayoutY() + distanceY;
	      // 计算出 x、y 后将结点重定位到指定坐标点 (x, y)
	      node.relocate(x, y);
	    });
	}
	protected void handleMousePressed(MouseEvent e)
	{
		x1=e.getX();
		y1=e.getY();
	}
	protected void handleMouseDragged(MouseEvent e)
	{
		x2=e.getSceneX();
		y2=e.getSceneY();
		Line myline=new Line(x1,y1,x2,y2);
		myline.setStrokeWidth(1);
		myline.setStroke(Color.BLACK);
		draggable(myline);
		pane.getChildren().add(myline);
		x1=x2;
		y1=y2;
	}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值