JavaFX-绝对布局,其中一个组件可以扩展到另一个组件上,而无需移动它
我有一个组件,具有两种状态“已查看”和“已编辑”。“编辑”后,组件必须显示一些控件并占用更多的水平空间。在一个视图中,我垂直显示了许多组件。我希望“已编辑”组件悬停在其兄弟节点上,这样视图就不会垂直调整大小JavaFX-绝对布局,其中一个组件可以扩展到另一个组件上,而无需移动它,javafx,hover,components,position,Javafx,Hover,Components,Position,我有一个组件,具有两种状态“已查看”和“已编辑”。“编辑”后,组件必须显示一些控件并占用更多的水平空间。在一个视图中,我垂直显示了许多组件。我希望“已编辑”组件悬停在其兄弟节点上,这样视图就不会垂直调整大小 All "viewed" One "edited" +--------------------+ +------------------
All "viewed" One "edited"
+--------------------+ +--------------------+
| +----------------+ | | +----------------+ |
| | Lorem ipsum | | | | Lorem ipsum | |
| | dolor. | | | | dolor. | |
| +----------------+ | | +----------------+ |
| +----------------+ | |+------------------+|
| | Will be edited | | || I am edited ||
| +----------------+ | ||..................||
| +----------------+ | || [Cancel] [Save] ||
| | Will be | | |+------------------+|
| |partially hidden| | | |partially hidden| |
| +----------------+ | | +----------------+ |
+--------------------+ +--------------------+
作为JavaFx的新手,我不得不承认我不知道如何做到这一点。我已经读到,“绝对”窗格或锚烷
可能有助于显示一个组件悬停在另一个组件上。在编辑时,StackPane
似乎也可用于隐藏或显示组件
你知道有什么东西可以用来达到这种效果吗?或者你能给我一些关于如何构建它的提示吗
坦克很多这里有一个例子,说明如何使用
堆叠窗格
:
控制器类:
package example;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
@FXML
private TextField leftTF, rightTF;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
TextField[] tfs = new TextField[]{leftTF, rightTF};
for (TextField tf : tfs) {
// Create and show buttons under the text field on text changed:
tf.textProperty().addListener((observable, oldValue, newValue) -> {
VBox vBox = (VBox) tf.getParent();
if (vBox.getChildren().size() == 1) {
Button cancelBtn = new Button("Cancel");
Button saveBtn = new Button("Save");
HBox hBox = new HBox(cancelBtn, saveBtn);
hBox.setStyle("-fx-background-color: lightgrey; -fx-border-color: black; -fx-padding: 3;");
hBox.setAlignment(Pos.CENTER);
vBox.getChildren().add(hBox);
// Lower left and right padding to have more space horizontally:
vBox.setPadding(new Insets(5, 3, 10, 3));
vBox.toFront();
// Remove overlaying box on button click and change padding to original values:
Button[] btns = new Button[]{cancelBtn, saveBtn};
for (Button btn : btns) {
btn.setOnAction(event -> {
vBox.getChildren().remove(1);
vBox.setPadding(new Insets(5, 10, 10, 10));
tf.requestFocus();
});
}
}
});
}
}
}
FXML:
将“已查看”和“已编辑”视图放在堆栈窗格中,然后调用setVisible()
切换您看到的控件。即使控件的visible
属性为false,也会计算它们的大小。好的,这样可以隐藏/显示控件。但是不调整容器的大小如何?我不想在“编辑”时将组件移到下面“一个人会长大的。哦,好吧,我想我误解了你的意图。除非你发一个帖子,否则你可能得不到多少有用的帮助。这似乎奏效了。但是,最后一个节点“将部分隐藏”与“未编辑”嵌套在同一面板中。所有这些行(“Lorem ipsum dolor.”、“未编辑”和“将部分隐藏”)都应该添加/删除,我希望避免嵌套它们,管理一个列表比管理一个树更容易。