- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在显示 imageView 的可调整大小的 Pane 中,我想选择多个矩形。
为此,我创建了一个 SelectableImageViewPane 类。两类ImageViewPane和 RubberBandSelection来自 com.bitplan.javafx 项目,我是该项目的提交者。
当调整窗口大小时,相关 Pane 的大小也会很好地调整,正如您可以从例如生成的调试输出中看到的那样。 SelectableImageViewPaneDemo以及以下示例屏幕截图。不幸的是,选择矩形没有调整大小/重新定位。
我如何确保子矩形相对于周围的玻璃板调整大小/位置并与 ImageViewPane/ImageView 同步?
package com.bitplan.javafx;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.geometry.Bounds;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
/**
* an ImageViewPane with a RubberBandSelection that properly resizes the rectangles
* @author wf
*
*/
public class SelectableImageViewPane extends StackPane {
protected static Logger LOGGER = Logger.getLogger("com.bitplan.javafx");
public static boolean debug=true;
private RubberBandSelection selection;
private ImageViewPane imageViewPane;
private Pane glassPane;
/**
* get my selection
* @return
*/
public RubberBandSelection getSelection() {
return selection;
}
/**
* show the bound of the given node with the given title
* @param title
* @param n
*/
public void showBounds(String title,Node n) {
if (debug) {
Bounds b = n.getLayoutBounds();
LOGGER.log(Level.INFO,String.format("%s: min %.0f,%.0f max %.0f,%.0f",title,b.getMinX(),b.getMinY(),b.getMaxX(),b.getMaxY()));
}
}
@Override
protected void layoutChildren() {
super.layoutChildren();
int index=1;
if (debug) {
showBounds("pane",this);
showBounds("imageViewPane",imageViewPane);
showBounds("glassPane",glassPane);
showBounds("imageView",imageViewPane.imageViewProperty().get());
}
for (Node n:selection.selected) {
showBounds(""+(index++),n);
}
}
/**
* create me
* @param imageView
*/
public SelectableImageViewPane(ImageView imageView) {
imageViewPane=new ImageViewPane(imageView);
getChildren().add(imageViewPane);
StackPane.setAlignment(imageViewPane, Pos.CENTER);
glassPane = new AnchorPane();
glassPane.setStyle("-fx-background-color: rgba(0, 0, 0, 0.1);");
getChildren().add(glassPane);
//glassPane.prefWidthProperty().bind(imageViewPane.widthProperty());
//glassPane.prefHeightProperty().bind(imageViewPane.heightProperty());
selection = new RubberBandSelection(glassPane);
selection.setSelectButton(true);
}
}
更新同时I modified RubberBandSelection记住父级中矩形的相对边界(稍后在我的应用程序中使用矩形时我将需要它)。如果父级的尺寸发生变化,此信息可用于正确布局父级中的矩形。
Bounds rB = s.relativeBounds;
double w = getWidth();
double h=getHeight();
double minX=rB.getMinX()*w;
double minY=rB.getMinY()*h;
double width=rB.getWidth()*w;
double height=rB.getHeight()*h;
layoutInArea(s.node, minX,minY,width,height, 0, HPos.LEFT,
VPos.TOP);
该解决方案效果更好,但仍然存在一些问题,可能涉及父级内的 x/y 偏移。
更新了 SelectableImageViewPane
package com.bitplan.javafx;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.bitplan.javafx.RubberBandSelection.Selection;
import javafx.geometry.Bounds;
import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
/**
* an ImageViewPane with a RubberBandSelection that properly resizes the
* rectangles
*
* @author wf
*
*/
public class SelectableImageViewPane extends StackPane {
protected static Logger LOGGER = Logger.getLogger("com.bitplan.javafx");
public static boolean debug = true;
private RubberBandSelection selection;
private ImageViewPane imageViewPane;
private Pane glassPane;
/**
* get my selection
*
* @return
*/
public RubberBandSelection getSelection() {
return selection;
}
/**
* show the bound of the given node with the given title
*
* @param title
* @param n
*/
public void showBounds(String title, Node n) {
if (debug) {
Bounds b = n.getLayoutBounds();
LOGGER.log(Level.INFO, String.format("%s: min %.0f,%.0f max %.0f,%.0f", title, b.getMinX(), b.getMinY(),
b.getMaxX(), b.getMaxY()));
}
}
@Override
protected void layoutChildren() {
super.layoutChildren();
int index = 1;
if (debug) {
showBounds("pane", this);
showBounds("imageViewPane", imageViewPane);
showBounds("glassPane", glassPane);
showBounds("imageView", imageViewPane.imageViewProperty().get());
}
for (Selection s : selection.selected.values()) {
if (debug) {
showBounds("" + (index++), s.node);
LOGGER.log(Level.INFO, s.asPercent());
}
Bounds rB = s.relativeBounds;
double w = getWidth();
double h=getHeight();
double minX=rB.getMinX()*w;
double minY=rB.getMinY()*h;
double width=rB.getWidth()*w;
double height=rB.getHeight()*h;
layoutInArea(s.node, minX,minY,width,height, 0, HPos.LEFT,
VPos.TOP);
}
}
/**
* create me
*
* @param imageView
*/
public SelectableImageViewPane(ImageView imageView) {
imageViewPane = new ImageViewPane(imageView);
getChildren().add(imageViewPane);
StackPane.setAlignment(imageViewPane, Pos.CENTER);
glassPane = new AnchorPane();
glassPane.setStyle("-fx-background-color: rgba(0, 0, 0, 0.1);");
getChildren().add(glassPane);
// glassPane.prefWidthProperty().bind(imageViewPane.widthProperty());
// glassPane.prefHeightProperty().bind(imageViewPane.heightProperty());
selection = new RubberBandSelection(glassPane);
selection.setSelectButton(true);
}
}
最佳答案
实现此功能有两个主要因素:
请注意,chriscamacho 对原始代码进行了两处更改:
相对 Pane
package com.bitplan.javafx;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.Observable;
import javafx.geometry.BoundingBox;
import javafx.geometry.Bounds;
import javafx.scene.Parent;
import javafx.scene.control.Control;
import javafx.scene.layout.Pane;
/**
* We want a Pane that will automatically resize its components The components
* width height and position are all expressed as a relative of the width and
* height of the Pane from 0.0 to 1.0 As the Pane resizes the position and sizes
* will all remain relative to the Pane's new width and height. Aspect ratio is
* not respected
*
* see https://gist.github.com/chriscamacho/4f8b2e3e8f8340278b7c
*
* @author chriscamacho
* @author wf - modified to relative instead of percent
*
*/
public class RelativePane extends Pane implements RelativeSizer {
protected static Logger LOGGER = Logger.getLogger("com.bitplan.javafx");
public static boolean debug=false;
/**
* helper class to keep track of relative position
*/
public class ControlBundle {
public double rx, ry, rw, rh;
public Control control;
/**
* construct me for the given control c and the given relative positions
*
* @param c
* @param rX
* @param rY
* @param rW
* @param rH
*/
ControlBundle(Control c, double rX, double rY, double rW, double rH) {
control = c;
rx = rX;
ry = rY;
rw = rW;
rh = rH;
}
}
Map<Control, ControlBundle> controls = new HashMap<Control, ControlBundle>();
/**
* create a relative Pane
*/
public RelativePane() {
super();
widthProperty().addListener(o -> sizeListener(o));
heightProperty().addListener(o -> sizeListener(o));
}
/**
* show the bounds of the given node with the given title
*
* @param title
* @param b
*/
public static void showBoundsPercent(String title, Bounds b) {
LOGGER.log(Level.INFO,
String.format("%s: min %.0f%%,%.0f%% max %.0f%%,%.0f%%", title,
b.getMinX() * 100.0, b.getMinY() * 100.0, b.getMaxX() * 100.0,
b.getMaxY() * 100.0));
}
/**
* show the given bounds with the given title
*
* @param title
* @param b
*/
public static void showBounds(String title, Bounds b) {
LOGGER.log(Level.INFO, String.format("%s: min %.0f,%.0f max %.0f,%.0f",
title, b.getMinX(), b.getMinY(), b.getMaxX(), b.getMaxY()));
}
/**
* listen to a change of the given observable
* @param o
*/
void sizeListener(Observable o) {
int index=0;
for (ControlBundle cb : controls.values()) {
index++;
double w = getWidth() * cb.rw;
double h = getHeight() * cb.rh;
double x = getWidth() * cb.rx;
double y = getHeight() * cb.ry;
if (debug) {
showBoundsPercent("r"+index,new BoundingBox(cb.rx,cb.ry,cb.rw,cb.rh));
showBounds("a"+index,new BoundingBox(x,y,w,h));
}
cb.control.setPrefWidth(w);
cb.control.setMinWidth(w);
cb.control.setMaxWidth(w);
cb.control.setPrefHeight(h);
cb.control.setMinHeight(h);
cb.control.setMaxHeight(h);
cb.control.setLayoutX(x);
cb.control.setLayoutY(y);
}
}
/**
* add a control with the given percentages
*
* @param ctrl
* @param x
* @param y
* @param w
* @param h
*/
public void addControl(Control ctrl, double x, double y, double w, double h) {
this.getChildren().add(ctrl);
controls.put(ctrl, new ControlBundle(ctrl, x, y, w, h));
}
public void removeControl(Control ctrl) {
this.getChildren().remove(ctrl);
controls.remove(ctrl);
}
@Override
public Parent getSizer() {
return this;
}
}
关于JavaFX 调整子项相对于父项的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55076613/
当我编译我的 ionic 4 应用程序时,我得到这个错误:不开始。但是,如果我更改代码中的某些内容并再次编译,代码将成功编译。我查了一下它可能与路径(绝对/相对)有关。但在这些问题中,解决方案是使用相
现在我发现当我打开终端时,它总是显示这些消息: bash: /usr/local/texlive/2012/texmf/doc/man:: No such file or directory bash
我有一些具有不同 url 前缀的嵌套模块。现在我想在一个模块中导航而不指定前缀(在我的模块中,我不想知道在哪个前缀下可以访问该模块)。 这些是我的 app.module 的路线: const APP_
我想在java中进行日期范围搜索假设我想搜索从2019年10月22日到当前日期。但问题是在两周的 block 大小中进行日期范围搜索(考虑到这可能会有所不同,但以周为单位),例如这里开始日期将为 20
我正在尝试实现移动到单击鼠标的点。 但是我遇到了 X 轴镜像行为的问题。当我点击顶部 -> 它移动到底部,当我点击底部 -> 它移动到顶部。 这里是原始位置的例子 我点击了屏幕上有红十字的位置。 但它
尝试使用以下方法让对象跟随光标: int mx =(int) MouseInfo.getPointerInfo().getLocation().getX()-50; Player.setX(mx);
我有 4 个 JButton 设置在彼此下方。我希望当用户水平调整框架大小时它们左右移动。 例如:帧大小:400,400 按钮位置:300,200 现在我将框架大小调整为:600,400 Button
我想要做的是将一个元素(我用作背景的彩色 UIView)定位到我的 Storyboard 中,以便它从 ImageField 的中间开始。并填充所有内容,直到屏幕底部。我正在使用 xcode7 和 s
我正在编写一些 C++ 代码,它主要为共享它的其他两个项目提供一个类,但也包括一个小程序,以便在需要时可以从命令行使用它。该类必须加载一些资源,这些资源被写入资源文件夹中的多个文件。这些文件的路径当然
我能以某种方式随时获得相对于帧初始引用的加速度矢量吗? (我的意思是:xArbitraryZVertical 模式下的帧引用,我第一次得到 Core Motion 数据)我试图做什么:每次我得到 CM
saved 我希望 div#one 在父 div 的左边缘和提交按钮的左边缘之间的空间居中。 最佳答案 还有几种方法: saved 很难说 saved 文本没有居中在容器 d
所以我在页面上有一个带有背景图像的对象,在 mousemove 上它移动了相对于鼠标的背景位置。但我遇到的唯一问题是在鼠标进入对象时将背景图像动画化到鼠标的当前位置。 我能够将背景位置动画化回其原始位
我的一个网站中有一个图像缩放属性。我想相对于 div 的中心缩放图像。 缩放功能如下。 function zoom(zm) { img=document.getElementById("pic"
我正在尝试调整水平导航栏左侧的导航栏 Logo 的大小,然后让其余导航栏元素占据相同的垂直空间并在空间中垂直居中。导航栏元素目前不使用完整的垂直空间。我尝试过的每个尺寸属性都产生了另一个问题。感谢所有
我有一些 h2 文本当前在移动 View 中左对齐,位于居中的 div 上方。我怎样才能将它对齐到移动 View 中相对于 div 的左对齐(应用下面的 CSS 中提供的媒体查询)? CodePen
我想让文本元素(在本例中为 h2 副标题)居中,方法是让它忽略左侧的 float 图像。我更喜欢 h2 副标题与 h1 标题垂直居中对齐。有没有什么办法可以单独使用 CSS 来做到这一点? 这是一个示
您好! 我在这个网站上工作,但我一直遇到同样的问题。当我把边距放在百分比而不是像素时,它似乎是从包装器或页面中获取百分比。可能是一些愚蠢的错误,但我并没有真正使用过百分比。无论如何,我所说的类是“ L
我很好奇这是怎么做到的,我做了类似的东西,例如 Home About Search bar Container
我希望我的 firstLabel 位于同一行文本字段的右侧。 //css input[type="text"]{ display:block; margin-botto
我正在尝试绘制多边形,并希望能够单击我的框架以获取鼠标坐标,以便更快地将心理图像转换为 x/y 值。 我在用 System.out.println("("+ MouseInfo.getPointerI
我是一名优秀的程序员,十分优秀!