Java 连接多个对象以创建一个对象
现在我想在javafx中创建一个哑铃形状,我知道如何创建它并在中控制它,但问题是我需要将形状视为多个三个对象,而不仅仅是一个对象我是java和oop的新手 我只想创建扩展javafx节点的哑铃形状 提前谢谢Java 连接多个对象以创建一个对象,java,oop,javafx,Java,Oop,Javafx,现在我想在javafx中创建一个哑铃形状,我知道如何创建它并在中控制它,但问题是我需要将形状视为多个三个对象,而不仅仅是一个对象我是java和oop的新手 我只想创建扩展javafx节点的哑铃形状 提前谢谢 public static void dumbell_builder(Group root) { Line joiner= line_builder(30,50,20,40,"#00c9e0",1,"joiner"); Circle rball=ball_builder(30,50,
public static void dumbell_builder(Group root) {
Line joiner= line_builder(30,50,20,40,"#00c9e0",1,"joiner");
Circle rball=ball_builder(30,50, 2,"#00c9e0",true,joiner,"Rball");
Circle lball=ball_builder(20,40, 2,"#00c9e0",false,joiner,"Lball");
root.getChildren().addAll(joiner,lball,rball);
}
public static Line line_builder(int sx ,int sy, int ex,int ey,String Stroke,int width,String id) {
Line line= new Line(sx,sy,ex,ey);
line.setStrokeWidth(width);
line.setStroke(Paint.valueOf(Stroke));
line.setId(id);
return line;
}
private static Circle ball_builder(int x,int y, int r,String fill,boolean right,Line line,String id) {
Circle ball=new Circle(x,y,r);
ball.setFill(Paint.valueOf(fill));
ball.setId(id);
ball.setOnMousePressed(event->{
strtdrag=true;
});
ball.setOnMouseDragged(event->{
if(strtdrag) {
ball.setCenterY(event.getY());
ball.setCenterX(event.getX());
if (right) {
line.setEndY(event.getY());
line.setEndX(event.getX());
}else {
line.setStartY(event.getY());
line.setStartX(event.getX());
}
}
});
ball.setOnMouseReleased(event ->{
strtdrag=false;
});
return ball;
}
这是我尝试创建邓贝尔类
public static void create_dumbell(Group root,double sx,double sy,double ex,double ey) {
DoubleProperty startX = new SimpleDoubleProperty(sx);
DoubleProperty startY = new SimpleDoubleProperty(sy);
DoubleProperty endX = new SimpleDoubleProperty(ex);
DoubleProperty endY = new SimpleDoubleProperty(ey);
Line ru = new ControlLine(startX, startY, endX, endY);
Anchor control1 = new Anchor(Color.FORESTGREEN, ru.startXProperty(), ru.startYProperty(), 3);
Anchor control2 = new Anchor(Color.FORESTGREEN, ru.endXProperty(), ru.endYProperty(), 3);
root.getChildren().addAll(ru,control1,control2);
}
class ControlLine extends Line {
ControlLine(DoubleProperty startX, DoubleProperty startY, DoubleProperty endX, DoubleProperty endY) {
startXProperty().bind(startX);
startYProperty().bind(startY);
endXProperty().bind(endX);
endYProperty().bind(endY);
setStrokeWidth(2);
setStroke(Color.FORESTGREEN.deriveColor(0, 1, 1, 0.5));
}
}
// a draggable anchor displayed around a point.
class Ball extends Circle {
Ball(Color color, DoubleProperty x, DoubleProperty y, double radius) {
super(x.get(), y.get(), radius);
setFill(color.deriveColor(1, 1, 1, 0.5));
setStroke(color);
setStrokeWidth(2);
setStrokeType(StrokeType.OUTSIDE);
x.bind(centerXProperty());
y.bind(centerYProperty());
enableDrag();
}
Ball(Color color, double x, double y, double radius) {
super(x, y, radius);
setFill(color.deriveColor(1, 1, 1, 0.5));
setStroke(color);
setStrokeWidth(2);
setStrokeType(StrokeType.OUTSIDE);
enableDrag();
}
// make a node movable by dragging it around with the mouse.
private void enableDrag() {
final Delta dragDelta = new Delta();
setOnMousePressed(mouseEvent -> {
// record a delta distance for the drag and drop operation.
dragDelta.x = getCenterX() - mouseEvent.getX();
dragDelta.y = getCenterY() - mouseEvent.getY();
});
setOnMouseReleased(mouseEvent -> getScene().setCursor(Cursor.HAND));
setOnMouseDragged(mouseEvent -> {
double newX = mouseEvent.getX() + dragDelta.x;
if (newX > 0 && newX < getScene().getWidth()) {
setCenterX(newX);
}
double newY = mouseEvent.getY() + dragDelta.y;
if (newY > 0 && newY < getScene().getHeight()) {
setCenterY(newY);
}
});
}
// records relative x and y co-ordinates.
private class Delta { double x, y; }
}
publicstaticvoidcreate\u dumbell(组根、双sx、双sy、双ex、双ey){
DoubleProperty startX=新的SimpleDoubleProperty(sx);
DoubleProperty startY=新的SimpleDoubleProperty(sy);
DoubleProperty endX=新的SimpleDoubleProperty(ex);
DoubleProperty endY=新的SimpleDoubleProperty(ey);
行ru=新的控制线(startX、startY、endX、endY);
锚点控制1=新锚点(Color.FORESTGREEN,ru.startXProperty(),ru.startYProperty(),3);
锚点控制2=新锚点(Color.FORESTGREEN,ru.endXProperty(),ru.endYProperty(),3);
root.getChildren().addAll(ru、control1、control2);
}
类控制线延伸线{
控制器线(双属性startX、双属性startY、双属性endX、双属性endY){
startXProperty().bind(startX);
startYProperty().bind(startY);
endXProperty().bind(endX);
endYProperty().bind(endY);
设定行程宽度(2);
设定行程(颜色.森林绿.衍生色(0,1,1,0.5));
}
}
//围绕点显示的可拖动锚。
类球延伸圆{
球(颜色、双属性x、双属性y、双半径){
super(x.get(),y.get(),半径);
setFill(颜色:deriveColor(1,1,1,0.5));
设定行程(颜色);
设定行程宽度(2);
设置行程类型(行程类型外部);
x、 绑定(centerXProperty());
y、 绑定(centerYProperty());
enableDrag();
}
球(彩色、双x、双y、双半径){
super(x,y,半径);
setFill(颜色:deriveColor(1,1,1,0.5));
设定行程(颜色);
设定行程宽度(2);
设置行程类型(行程类型外部);
enableDrag();
}
//使用鼠标拖动节点,使其可移动。
私有void enableDrag(){
最终增量dragDelta=新增量();
setOnMousePressed(鼠标事件->{
//记录拖放操作的增量距离。
dragDelta.x=getCenterX()-mouseEvent.getX();
dragDelta.y=getCenterY()-mouseEvent.getY();
});
setOnMouseReleased(mouseEvent->getScene().setCursor(Cursor.HAND));
SetOnMouseDrawed(mouseEvent->{
double newX=mouseEvent.getX()+dragDelta.x;
如果(newX>0&&newX0&&newY
创建一个窗格,在其中添加形状并访问它,而不是形状。这就是你的意思吗?我不完全理解你的问题,因为英语有点蹩脚
如果需要组件的特定布局,还可以通过创建扩展窗格的类来创建自定义节点,然后重写其layoutChildren()方法。创建组的子类,该子类将线和圆添加到自身中。您还可以使用绑定来保持线与圆的连接:
public class Dumbell extends Group {
private boolean dragging ;
public Dumbell() {
Line joiner = new Line();
joiner.setId("joiner");
joiner.setStroke(Paint.valueOf("#00c9e0"));
joiner.setStrokeWidth(1);
Circle rball = createBall(30, 50);
Circle lball = createBall(20, 40);
joiner.startXProperty().bind(rball.centerXProperty());
joiner.startYProperty().bind(rball.centerYProperty());
joiner.endXProperty().bind(lball.centerXProperty());
joiner.endYProperty().bind(lball.centerYProperty());
getChildren().addAll(joiner, lball, rball);
}
private Circle createBall(double x, double y) {
Circle ball = new Circle(x, y, 2);
ball.setFill(Paint.valueOf("#00c9e0"));
ball.setOnMousePressed(e -> dragging = true );
ball.setOnMouseDragged(e -> {
if (dragging) {
ball.setCenterX(e.getX());
ball.setCenterY(e.getY());
}
});
ball.setOnMouseReleased(e -> dragging = false);
return ball ;
}
}
那你只需要
Dumbell dumbell = new Dumbell();
root.getChildren().add(dumbell);
只需将三个节点放在各自的
组中
;然后你可以把这个组
当作一个单独的对象。我正在做的程序是允许用户点击在点击位置创建右球,在第二次点击位置创建左球,而不仅仅是一个固定的位置或一次,这与我的评论有什么关系?因为我认为我无法控制每个哑铃的边界我已经用我的上一次试验更新了这个问题code@James_D我不确定我是否正确理解了这个问题,但如果他真的想把它作为一个单独的节点来对待,这是我能想到的最简单的方法,如果他需要一个特殊的布局。