【问题标题】:How to edit text / Image/Button in a pane in JavaFX FXML如何在 JavaFX FXML 的窗格中编辑文本/图像/按钮
【发布时间】:2021-03-28 12:00:58
【问题描述】:

had a question earlier 关于如何在 JavaFX FXML 中将窗格添加到 VBox。我现在的问题是如何编辑我添加的窗格中的内容? FXML 文件的代码仍然相同。新编辑的Java代码如下:

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;

public class HotelReservationController implements Initializable{
@FXML
    private ScrollPane scrollPaneContent;
    @FXML
    private VBox vboxData;
    @FXML
    private AnchorPane cardAnchor;
    @FXML
    private HBox cardHBox;
    @FXML
    private Text cardTitle;

    @Override
        public void initialize(URL arg0, ResourceBundle arg1) {
            URL cardURL = getClass().getResource("/application/Cards.fxml");
//      vboxData.getChildren().add(cardAnchor);
        for (int j = 0; j < 10; j++) {
            Parent cardAnchor=null;
            Parent cardHBox=null;
            Parent cardTitle=null;
            try {
                cardAnchor = FXMLLoader.load(cardURL);
                cardHBox= FXMLLoader.load(cardURL);
                cardTitle = FXMLLoader.load(cardURL);
                cardTitle.setText("test" + j);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            vboxData.getChildren().add(cardAnchor);
        }
        
        try {
            connectToHotel();
        } catch (ClassNotFoundException | SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
   
            
        }

但是,当我这样做时,我遇到了以下错误:

javafx.fxml.LoadException: 
/C:/Users///////bin/application/HotelReservation.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at application.Main.start(Main.java:18)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: javafx.scene.layout.AnchorPane cannot be cast to javafx.scene.text.Text
    at application.HotelReservationController.initialize(HotelReservationController.java:55)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    ... 17 more

如何添加此文本字段和其他文本字段(我猜处理图像窗格和按钮类似于处理它们)?

【问题讨论】:

  • 该代码无法编译; Parent 没有 setText() 方法。你需要在控制器上调用一个方法,见stackoverflow.com/questions/14187963/…
  • 所以据我了解,我需要有一个用于 Cards.fxml 的控制器,在该控制器中我创建了一个动态更改文本的方法,我只是调用该方法。然后我加载 cardAnchor 属性,然后它应该自动设置它?
  • “编辑文本/图像/按钮”是什么意思?编辑按钮意味着什么?谁在进行编辑,是最终用户还是您程序中的某些人?您能否提供一个编辑示例以及它对您希望使其可编辑的每一件事的作用? user editable label 的示例在这里,但我认为这不是您真正要问的。
  • 所以,我有一个看起来像卡片的布局,我想将它动态添加到滚动窗格中的 VBox 中。该卡片有一个图像视图和 4 个文本:标题、位置、评级和描述,它还有一个按钮,按下时将导致一个新视图。在链接的问题中,我问如何将卡片动态添加到 VBox(所有代码都在那里),它就像@James_D 所说的那样工作。但是当我尝试动态编辑文本时(我想从数据库中提取数据,然后编辑 For 循环中的每个字段,但直到现在我只是在测试,所以我还没有连接它// 没有工作)。

标签: java eclipse javafx fxml scenebuilder


【解决方案1】:

因此,在考虑到@James_D 的答案后,我所要做的就是为 Cards.fxml 创建一个控制器,并在该控制器中添加数据。

我的是

public class CardsController implements Initializable{
@FXML
    private Text cardTitle;
    @FXML
    private Text cardLocation;
    @FXML
    private Text cardRating;
    @FXML
    private Text cardDescription;
    @FXML
    private Button cardDetails;
    @FXML
    private ImageView cardPhoto;
    @FXML
    private HBox cardHBox;
    @FXML
    private AnchorPane cardAnchor;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // TODO Auto-generated method stub
        cardTitle.setText("Test Title");
        cardLocation.setText(" Test Location" );
        cardRating.setText("5");
        cardDescription.setText("This is only for testing, data should be imported later");
    }
}

现在除了控制器之外,在 HotelReservationController 类中,特别是在我让它显示所有卡片的 for 循环中,我应该执行以下操作:

FXMLLoader loader = new FXMLLoader(getClass().getResource("/application/Cards.fxml"));
                loader.load();

我的问题是 loader.load()。除非我加载加载程序,否则不会调用 initialize 方法,这就是给我带来很多问题的原因。

希望这会在未来帮助像我这样的其他无知的人。

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2015-07-21
    • 2016-03-25
    • 1970-01-01
    相关资源
    最近更新 更多