2015-08-31 61 views
0

我无法使buttonContainerHBox中的按钮发挥作用,因为我根本无法点击它们,因此可能会“卡住”这样说。这发生在多个IDE中,所以它不可能是这样。我不明白为什么他们没有能力点击它们,但我确信我正在犯一些基本的错误。无法点击HBox中的按钮

这里是我的简单的代码:

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(); 
    } 
} 
+0

哪里是对的OnAction如何工作的概述按钮代码? – Programmer

+0

这个演示没有setOnAction代码。问题是如果我在StackPane中有两组按钮,FX不会让我点击一个按钮。该按钮被卡住,并没有“点击”动画。 –

回答

0

StackPane中,HBox ES将要被调整,以填补StackPane。因此这两个HBox都填充整个区域,对齐设置将按钮定位在其中。因此,虽然按钮实际上不重叠,但HBox es。

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(); 
    } 
} 

你可以阅读所有的布局窗格中tutorial