【发布时间】:2021-09-03 22:12:36
【问题描述】:
与 Swing 中的“一切都是 JPanel”相比,在 JavaFX 中创建新组件对我来说仍然是一件很麻烦的事情。
我正在尝试制作一个固定大小的组件。我不敢称它为控件,它是一个活动窗格,而不是按钮。
但这是我的问题。
我想要的固定大小小于元素的内容。
网格实际上是 200x200。我将它向上和向左移动 25x25,并且我正在尝试将固定大小设为 150x150。您可以在我的示例中看到我尝试了各种将其强制为 150 的方法,但在我的测试中,大小永远不会粘住。另外,需要明确的是,我希望这些线条会在组件的边界处剪辑。
这大致就是我在人为的情况下拍摄的内容(请注意,这看起来比 150x150 大,因为我的 Mac 上的视网膜显示屏使所有内容都翻倍):
我已将一些放入 FlowPane,它们会直接堆叠,但忽略 150x150 尺寸。
FlowPane fp = new FlowPane(new TestPane(), new TestPane(), new TestPane());
var scene = new Scene(fp, 640, 480);
stage.setScene(scene);
我尝试在 ScrollPane 中粘贴一个,但滚动条永远不会出现,即使在调整窗口大小后也是如此。
TestPane pane = new TestPane();
ScrollPane sp = new ScrollPane(pane);
var scene = new Scene(sp, 640, 480);
stage.setScene(scene);
我很难辨别在这些情况下我应该扩展区域还是控制。
我缺少一些基本的东西。
package pkg;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.control.Control;
import javafx.scene.shape.Line;
import javafx.scene.transform.Translate;
public class TestPane extends Control {
public TestPane() {
setMinHeight(150);
setMaxHeight(150);
setMinWidth(150);
setMaxWidth(150);
setPrefHeight(150);
setPrefWidth(150);
populate();
}
@Override
protected double computePrefHeight(double width) {
return 150;
}
@Override
protected double computePrefWidth(double height) {
return 150;
}
@Override
protected double computeMaxHeight(double width) {
return 150;
}
@Override
protected double computeMaxWidth(double height) {
return 150;
}
@Override
protected double computeMinHeight(double width) {
return 150;
}
@Override
protected double computeMinWidth(double height) {
return 150;
}
@Override
public boolean isResizable() {
return false;
}
private void populate() {
Translate translate = new Translate();
translate.setX(-25);
translate.setY(-25);
getTransforms().clear();
getTransforms().addAll(translate);
ObservableList<Node> children = getChildren();
for (int i = 0; i < 4; i++) {
Line line = new Line(0, i * 50, 200, i * 50);
children.add(line);
line = new Line(i * 50, 0, i * 50, 200);
children.add(line);
}
}
}
补充说明。
我想要一个固定大小的组件。这是一个矩形。我想要它 X x Y 大。
我想在我的盒子里画东西。线条、圆圈、文字。
我希望我绘制的东西被剪辑到组件的边界。
我不想使用 Canvas。
更多附录。
我要查找的内容与 ScrollPane 所做的没有太大区别,只是我不想要任何滚动条,而且我不希望外围窗格的大小增大或缩小。
【问题讨论】:
-
您是否考虑过使用场景构建器进行设计?
-
忘记这个想法 - 绝对 固定大小 一直是并且仍然是完全错误的思考方向。而是将您的问题表述为布局,即考虑关系(大小、位置)
-
您在寻找
GridPane吗?将Pane添加到GridPane中的每个单元格。使用鼠标在每个Pane上绘图。 stackoverflow.com/questions/53708509/… -
@WillHartung 是的,这就是我的观点。布局边界不包括转换。因此,您的自定义组件将布置在父容器中,然后 然后 将应用转换。因此,您的方法不能很好地与放置它的布局窗格一起使用。请参阅openjfx.io/javadoc/16/javafx.graphics/javafx/scene/layout/…中的“视觉边界与布局边界”
标签: javafx