//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;
}
}
实现一个小型的图形绘制画板,包括直线、矩形、椭圆、多边形等基本图形
于 2022-05-08 14:45:07 首次发布