缩小父级时,JavaFX TreeView不会刷新,显示“儿童工件”。 [英] JavaFX TreeView not refreshing upon shrinking parent, showing "children artifacts"
问题描述
我有一个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屋!