抱歉,我是JavaFX的新手。 我的设置: 我有一个主要的FXML GUI,它一直显示。在这个主GUI中,我在AnchorPane中加载了另一个FXML。
第二个FXML最初使用以下内容加载到此AnchorPane(位于主GUI中):
<AnchorPane fx:id="rootSetPane" layoutX="228.0" prefHeight="710.0" prefWidth="887.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="228.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
然后我从那里使用@Override
public void initialize(URL url, ResourceBundle rb) {
AnchorPane paneHome;
try {
paneHome = FXMLLoader.load(getClass().getResource("HomePage.fxml"));
rootSetPane.getChildren().setAll(paneHome);
} catch (IOException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
}
。
这是AnchorPane,它位于相同的主GUI fxml中。
@FXML
private void foodFinder(ActionEvent event) throws IOException {
AnchorPane paneFoodFinder = FXMLLoader.load(getClass().getResource("ScreenFoodFinder.fxml"));
rootSetPane.getChildren().setAll(paneFoodFinder);
}
初始化主控制器(主GUI显示整个时间)
public void setPanel() throws IOException {
AnchorPane newPane = FXMLLoader.load(getClass().getResource("NewPane.fxml"));
rootSetPane.getChildren().setAll(newPane);
}
此主类中的工作方法示例(从同一主FXML中的按钮调用):
rootSetPane
不起作用的方法示例(使用对象调用):
rootSetPane
我在程序中使用主GUI中的按钮多次设置第二个窗格(这样可行)。尝试从主控制器类外部设置此窗格时,会发生此问题。我不能使用Main类的实例并调用方法来访问NullPointerException
(我无法使rootSetPane
静态)。我得到NullPointerException
。我确信这是一个业余的错误。有没有办法可以使用上面的方法更改此.offsetHeight
。
或者我是否必须制作其他课程来管理我的屏幕。最简单(甚至是肮脏)的解决方案将不胜感激
如果我能够在主GUI中触发按钮,它也会起作用,但这会导致同样的问题(container.style.display = "block";
// container is actually still invisible
// current style hasn't been calculated
container.offsetHeight;
// this forces a style recalc
// so the current style for the container is figured out.
// without this recalc, this element effectively has no style,
// and so when you transition from its current style (null) to a different one (opacity: 1), it just snaps to the new value.
container.style.opacity = 1;
// this triggers the transition.
// because the style was recalced before the transition was triggered,
// it will transition _from_ those values.
)。我有一种感觉,我不能使用类的对象引用元素,我也不能使这些元素静态。
答案 0 :(得分:0)
检查getClass().getResource("NewPane.fxml")
是否指向正确的文件。
答案 1 :(得分:0)
你可以创建一个扩展AnchorPane
的类。该类将是fxml的控制器。所以你可以创建它的实例,如:
SpecialAnchorClass anchor = new SpecialAnchorClass();
所以你的SpecialAnchorClass会是这样的:
public class SpecialAnchorClass extends AnchorPane implements Initializable{
//..@fxml nodes
/**
* Constructor
*/
public SpecialAnchorClass(){
//FXMLLOADER
FXMLLoader loader = new FXMLLoader(getClass().getResource("..path to fxml file"));
loader.setController(this);
loader.setRoot(this);
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void initialize(URL location, ResourceBundle resources) {
//when this method is called every fxml component has been initialized
}
}