缩小父级时,JavaFX TreeView不会刷新,显示“儿童工件”。 [英] JavaFX TreeView not refreshing upon shrinking parent, showing "children artifacts"

查看:115
本文介绍了缩小父级时,JavaFX TreeView不会刷新,显示“儿童工件”。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个TreeView,在缩小父目录时,我仍然看到原始子节点。只存在作为神器,不是真的存在而且不可点击。这是导致问题的代码的一部分。我知道,因为当我评论它时,TreeView工作正常。

I have a TreeView that upon shrinking the parent directory, I still see the original children. There are only present as an "artifact", not really there and not clickable. This is the part of my code that is causing the issue. I know because when I comment it out the TreeView works fine.

    selectionTreeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {
    @Override
    public TreeCell<String> call(TreeView<String> paramP) {
        return new TreeCell<String>(){
            @Override
            protected void updateItem(String paramT, boolean paramBoolean) {
                super.updateItem(paramT, paramBoolean);
                if(!isEmpty()){
                    setGraphic(new Label(paramT));
                    final TreeCell<String> this$ = this;
                    this.setOnMouseClicked(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent event) {
                        if(event.getClickCount()==2){
                            // Getting the node value.
                            String nodeValue = this$.getItem();
                        }
                    }
                    });
                }
            }
        };
    }
    });

这允许我在双击时返回子项的值。不确定如何纠正问题。任何建议,任何帮助将不胜感激?如果它有帮助,请在下面包含完整的源代码。最后使用JDK 8u5。

This allows me to return the value of the child when it is double clicked. Not sure how to correct the issue. Any suggestions, any help would be appreciated? Including entire source code below in case it will help. And finally using JDK 8u5.

package javafxapplication1;

import java.net.URL;
import java.sql.*;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.input.MouseEvent;
import javafx.util.Callback;

/**
*
* @author kevin_000
*/
public class FXMLDocumentController implements Initializable {

@FXML
private Label label;
@FXML TreeView selectionTreeView;

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");
    label.setText("Hello World!");
}
//should delete item selected, does not work currently
@FXML
private void testRemoveTreeItem(ActionEvent event) {
        TreeItem<String> c = (TreeItem)selectionTreeView.getSelectionModel().getSelectedItem();
        boolean remove = c.getParent().getChildren().remove(c);
        System.out.println("Remove");
    }

@Override
public void initialize(URL url, ResourceBundle rb) {
    createTree();
    //Get Name of TreeViewCell Double Clicked
    selectionTreeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {
    @Override
    public TreeCell<String> call(TreeView<String> paramP) {
        return new TreeCell<String>(){
            @Override
            protected void updateItem(String paramT, boolean paramBoolean) {
                super.updateItem(paramT, paramBoolean);
                if(!isEmpty()){
                    setGraphic(new Label(paramT));
                    final TreeCell<String> this$ = this;
                    this.setOnMouseClicked(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent event) {
                        if(event.getClickCount()==2){
                            // Getting the node value.
                            String nodeValue = this$.getItem();
                        }
                    }
                    });
                }
            }
        };
    }
    });
}

  public void createTree(String... rootItems) {
    //create root
    TreeItem<String> root = new TreeItem<>("Sales Analysis & Goal Is King");
    //root.setExpanded(true);
    //january
    TreeItem<String> itemJanuary = new TreeItem<>("January");
    itemJanuary.setExpanded(false);
    TreeItem<String> itemSalesAnalysisJanuary = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisJanuary.setExpanded(false);
    TreeItem<String> itemGoalIsKingJanuary = new TreeItem<>("Goal Is King");
    itemGoalIsKingJanuary.setExpanded(false);        
    //february
    TreeItem<String> itemFebruary = new TreeItem<>("February");
    itemFebruary.setExpanded(false);
    TreeItem<String> itemSalesAnalysisFebruary = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisFebruary.setExpanded(false);
    TreeItem<String> itemGoalIsKingFebruary = new TreeItem<>("Goal Is King");
    itemGoalIsKingFebruary.setExpanded(false);
    //march
    TreeItem<String> itemMarch = new TreeItem<>("March");
    itemMarch.setExpanded(false);
    TreeItem<String> itemSalesAnalysisMarch = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisMarch.setExpanded(false);
    TreeItem<String> itemGoalIsKingMarch = new TreeItem<>("Goal Is King");
    itemGoalIsKingMarch.setExpanded(false);
    //april
    TreeItem<String> itemApril = new TreeItem<>("April");
    itemApril.setExpanded(false);
    TreeItem<String> itemSalesAnalysisApril = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisApril.setExpanded(false);
    TreeItem<String> itemGoalIsKingApril = new TreeItem<>("Goal Is King");
    itemGoalIsKingApril.setExpanded(false);
    //may
    TreeItem<String> itemMay = new TreeItem<>("May");
    itemMay.setExpanded(false);
    TreeItem<String> itemSalesAnalysisMay = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisMay.setExpanded(false);
    TreeItem<String> itemGoalIsKingMay = new TreeItem<>("Goal Is King");
    itemGoalIsKingMay.setExpanded(false);
    //june
    TreeItem<String> itemJune = new TreeItem<>("June");
    itemJune.setExpanded(false);
    TreeItem<String> itemSalesAnalysisJune = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisJune.setExpanded(false);
    TreeItem<String> itemGoalIsKingJune = new TreeItem<>("Goal Is King");
    itemGoalIsKingJune.setExpanded(false);
    //july
    TreeItem<String> itemJuly = new TreeItem<>("July");
    itemJuly.setExpanded(false);
    TreeItem<String> itemSalesAnalysisJuly = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisJuly.setExpanded(false);
    TreeItem<String> itemGoalIsKingJuly = new TreeItem<>("Goal Is King");
    itemGoalIsKingJuly.setExpanded(false);        
    //august
    TreeItem<String> itemAugust = new TreeItem<>("August");
    itemAugust.setExpanded(false);
    TreeItem<String> itemSalesAnalysisAugust = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisAugust.setExpanded(false);
    TreeItem<String> itemGoalIsKingAugust = new TreeItem<>("Goal Is King");
    itemGoalIsKingAugust.setExpanded(false);        
    //september
    TreeItem<String> itemSeptember = new TreeItem<>("September");
    itemSeptember.setExpanded(false);
    TreeItem<String> itemSalesAnalysisSeptember = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisSeptember.setExpanded(false);
    TreeItem<String> itemGoalIsKingSeptember = new TreeItem<>("Goal Is King");
    itemGoalIsKingSeptember.setExpanded(false);        
    //october
    TreeItem<String> itemOctober = new TreeItem<>("October");
    itemOctober.setExpanded(false);
    TreeItem<String> itemSalesAnalysisOctober = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisOctober.setExpanded(false);
    TreeItem<String> itemGoalIsKingOctober = new TreeItem<>("Goal Is King");
    itemGoalIsKingOctober.setExpanded(false);        
    //november
    TreeItem<String> itemNovember = new TreeItem<>("November");
    itemNovember.setExpanded(false);
    TreeItem<String> itemSalesAnalysisNovember = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisNovember.setExpanded(false);
    TreeItem<String> itemGoalIsKingNovember = new TreeItem<>("Goal Is King");
    itemGoalIsKingNovember.setExpanded(false);        
    //december
    TreeItem<String> itemDecember = new TreeItem<>("December");
    itemDecember.setExpanded(false);
    TreeItem<String> itemSalesAnalysisDecember = new TreeItem<>("Sales Analysis");
    itemSalesAnalysisDecember.setExpanded(false);
    TreeItem<String> itemGoalIsKingDecember = new TreeItem<>("Goal Is King");
    itemGoalIsKingDecember.setExpanded(false);        

    //create stores, stores are children of SalesAnalsysis & GoalIsKing Trees
    try (Connection connection = DriverManager.getConnection(
            "jdbc:derby://localhost:1527/FJH_Stores_&_Employees","kevinkabatra","ew4pkd8d");
        Statement statement = connection.createStatement();) {
        ResultSet rs = statement.executeQuery("select LOCATION from STORES");
        while (rs.next()){
            //january
            itemSalesAnalysisJanuary.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis January"));
            itemGoalIsKingJanuary.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King January"));
            //february
            itemSalesAnalysisFebruary.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis February"));
            itemGoalIsKingFebruary.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King February"));
            //march
            itemSalesAnalysisMarch.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis March"));
            itemGoalIsKingMarch.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King March"));
            //april
            itemSalesAnalysisApril.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis April"));
            itemGoalIsKingApril.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King April"));
            //may
            itemSalesAnalysisMay.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis May"));
            itemGoalIsKingMay.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King May"));
            //june
            itemSalesAnalysisJune.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis June"));
            itemGoalIsKingJune.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King June"));
            //july
            itemSalesAnalysisJuly.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis July"));
            itemGoalIsKingJuly.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King July"));
            //august
            itemSalesAnalysisAugust.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis August"));
            itemGoalIsKingAugust.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King August"));
            //september
            itemSalesAnalysisSeptember.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis September"));
            itemGoalIsKingSeptember.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King September"));
            //october
            itemSalesAnalysisOctober.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis October"));
            itemGoalIsKingOctober.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King October"));
            //november
            itemSalesAnalysisNovember.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis November"));
            itemGoalIsKingNovember.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King November"));
            //december
            itemSalesAnalysisDecember.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Sales Analsysis December"));
            itemGoalIsKingDecember.getChildren().add(new 
                TreeItem<>(rs.getString("LOCATION")+" Goal Is King December"));
        }
    } catch (SQLException ex) {
        System.err.print("Exception: ");
        System.err.println(ex.getMessage());
    }
    //SalesAnalysis and GoalIsKing are children of each month,
    //months are children of root
    itemJanuary.getChildren().addAll(itemSalesAnalysisJanuary,itemGoalIsKingJanuary);
    itemFebruary.getChildren().addAll(itemSalesAnalysisFebruary,itemGoalIsKingFebruary);
    itemMarch.getChildren().addAll(itemSalesAnalysisMarch,itemGoalIsKingMarch);
    itemApril.getChildren().addAll(itemSalesAnalysisApril,itemGoalIsKingApril);
    itemMay.getChildren().addAll(itemSalesAnalysisMay,itemGoalIsKingMay);
    itemJune.getChildren().addAll(itemSalesAnalysisJune,itemGoalIsKingJune);
    itemJuly.getChildren().addAll(itemSalesAnalysisJuly,itemGoalIsKingJuly);
    itemAugust.getChildren().addAll(itemSalesAnalysisAugust,itemGoalIsKingAugust);
    itemSeptember.getChildren().addAll(itemSalesAnalysisSeptember,itemGoalIsKingSeptember);
    itemOctober.getChildren().addAll(itemSalesAnalysisOctober,itemGoalIsKingOctober);
    itemNovember.getChildren().addAll(itemSalesAnalysisNovember,itemGoalIsKingNovember);
    itemDecember.getChildren().addAll(itemSalesAnalysisDecember,itemGoalIsKingDecember);
    root.getChildren().addAll(itemJanuary,itemFebruary,itemMarch,
            itemApril,itemMay,itemJune,itemJuly,itemAugust,itemSeptember,
            itemOctober,itemNovember,itemDecember);
    selectionTreeView.setRoot(root);
}
}


推荐答案

bug在你的updateItem方法中 - 当空参数为true时你不是在调用setGraphic(null)。

The bug is in your updateItem method - you aren't calling setGraphic(null) when the empty parameter is true.

我应该注意在这种情况下使用setGraphic是不正确的 - 当你可以用paramT字符串调用setText时,你传入一个Label。

I should note that in this case using setGraphic is not correct - you're passing in a Label when you could just instead call setText with the paramT string.

此外,考虑到调用它的频率,我不会注意到你的updateItem方法正在做更多的工作。当item和empty参数更改为TreeCell的构造函数时(通过使用匿名构造函数),您应该移动与更新单元格无关的所有内容。这包括创建EventHandler - 只需要在构造函数中设置。

Additionally, I would be remiss in not noting that your updateItem method is doing way more work than it should be, considering how frequently it is called. You should move everything that is not specifically related to updating the cell when the item and empty parameters change into the constructor of the TreeCell (by using an anonymous constructor). This includes the creation of the EventHandler - which only needs to be set in the constructor.

这篇关于缩小父级时,JavaFX TreeView不会刷新,显示“儿童工件”。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆