[英]Buttons in Hbox uneven width with hgrow when distributed width can't be a whole number
[英]Can't click on buttons in HBox
我無法使buttonContainer
HBox
的按鈕正常工作,因為我根本無法單擊它們,可以這么說,它們“卡住了”。 這發生在多個IDE中,所以事實並非如此。 我不明白為什么無法單擊它們會卡住它們,但是我確定我犯了一些基本錯誤。
這是我的簡單代碼:
public class Game extends Application {
public static void main(String[] args) {
launch(args);
}
Button attack, run, drinkPotion, nextRoom;
StackPane root;
HBox buttonContainer, roomContainer;
Scene scene;
public void createNode() {
root = new StackPane();
scene = new Scene(root, 860, 640);
attack = new Button("Attack");
run = new Button("Run!");
drinkPotion = new Button("Drink Potion!");
nextRoom = new Button("Go to next room...");
buttonContainer = new HBox(12);
buttonContainer.getChildren().addAll(attack, run, drinkPotion);
buttonContainer.setAlignment(Pos.BOTTOM_LEFT);
roomContainer = new HBox();
roomContainer.getChildren().addAll(nextRoom);
roomContainer.setAlignment(Pos.BOTTOM_RIGHT);
root.getChildren().addAll(buttonContainer, roomContainer);
}
public void start(Stage stage) {
createNode();
stage.setScene(scene);
stage.show();
}
}
在StackPane
,將調整HBox
大小以填充StackPane
。 因此,此處的兩個HBox
都填充了整個區域,對齊設置將按鈕放置在其中。 因此,雖然按鈕實際上並沒有重疊,但是HBox
卻有重疊。
StackPane
(在某些情況下,以及其他窗格)中節點的z順序由children
列表中節點的順序確定。 因此,在您的代碼中, buttonContainer
位於roomContainer
“后面”。 這意味着鼠標單擊既可以指向roomContainer
的按鈕,也可以roomContainer
本身。 因此, buttonContainer
的按鈕將永遠不會獲得鼠標單擊。
一種解決方案是使用“實際”布局容器來適當地放置兩個按鈕容器。 例如,您可以使用AnchorPane
:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Game extends Application {
public static void main(String[] args) {
launch(args);
}
Button attack, run, drinkPotion, nextRoom;
AnchorPane root;
HBox buttonContainer, roomContainer;
Scene scene;
public void createNode() {
root = new AnchorPane();
scene = new Scene(root, 860, 640);
attack = new Button("Attack");
run = new Button("Run!");
drinkPotion = new Button("Drink Potion!");
nextRoom = new Button("Go to next room...");
buttonContainer = new HBox(12);
buttonContainer.getChildren().addAll(attack, run, drinkPotion);
roomContainer = new HBox();
roomContainer.getChildren().addAll(nextRoom);
AnchorPane.setBottomAnchor(buttonContainer, 0.0);
AnchorPane.setLeftAnchor(buttonContainer, 0.0);
AnchorPane.setBottomAnchor(roomContainer, 0.0);
AnchorPane.setRightAnchor(roomContainer, 0.0);
root.getChildren().addAll(roomContainer, buttonContainer);
}
@Override
public void start(Stage stage) {
createNode();
stage.setScene(scene);
stage.show();
}
}
或可能是BorderPane
:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class Game extends Application {
public static void main(String[] args) {
launch(args);
}
Button attack, run, drinkPotion, nextRoom;
BorderPane root;
HBox buttonContainer, roomContainer;
Scene scene;
public void createNode() {
root = new BorderPane();
scene = new Scene(root, 860, 640);
attack = new Button("Attack");
run = new Button("Run!");
drinkPotion = new Button("Drink Potion!");
nextRoom = new Button("Go to next room...");
buttonContainer = new HBox(12);
buttonContainer.getChildren().addAll(attack, run, drinkPotion);
buttonContainer.setAlignment(Pos.BOTTOM_CENTER);
roomContainer = new HBox();
roomContainer.getChildren().addAll(nextRoom);
roomContainer.setAlignment(Pos.BOTTOM_CENTER);
root.setLeft(buttonContainer);
root.setRight(roomContainer);
}
@Override
public void start(Stage stage) {
createNode();
stage.setScene(scene);
stage.show();
}
}
您可以在本教程中閱讀有關所有布局窗格如何工作的概述
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.