2016-06-13 96 views
1

编辑1:我想我可能已经想通了。Java - 为什么我的静态变量被设置为空?

这里是我的initialize()方法

public void initialize(URL location, ResourceBundle resources) { 
    groupList.setItems(createGroupFilter()); 
    groupList.getSelectionModel().selectedItemProperty().addListener(obs -> { 
     Group.setSelectedGroup(groupList.getSelectionModel().getSelectedItem()); 
     handleGroupSelected(); 
    }); 

我想,当我重新加载组列表的ListView这selectedItemProperty监听器被调用并将其设置为null。

我已经通过添加如果在监听器里的条件解决了这个问题:

public void initialize(URL location, ResourceBundle resources) { 
    groupList.setItems(createGroupFilter()); 
    groupList.getSelectionModel().selectedItemProperty().addListener(obs -> { 
     if(groupList.getSelectionModel().getSelectedItem() != null) { 
      Group.setSelectedGroup(groupList.getSelectionModel().getSelectedItem()); 
      handleGroupSelected(); 
     } 
    }); 

出于某种原因,我的静态“selectedGroup”变量被设置为null,我想不通为什么。

我已经进行了以下故障排除。

我有一个名为'refresh()'的方法,它调用一个名为'createGroupFilter()'的方法。我已经包含了下面的System.out.println语句,以便查看变量何时变为空。

private void refresh() { 
    System.out.println("before groupList.setItems(createGroupFilter()); " + Group.getSelectedGroup()); //TROUBLESHOOTING 
    groupList.setItems(createGroupFilter()); 
    System.out.println("after groupList.setItems(createGroupFilter()); " + Group.getSelectedGroup()); //TROUBLESHOOTING 
    if(Group.getSelectedGroup() != null) { 
     groupList.getSelectionModel().select(Group.getSelectedGroup()); 
     int n = groupList.getSelectionModel().getSelectedIndex(); 
     groupList.getFocusModel().focus(n); 
     groupList.scrollTo(n); 
     userList.setItems(createUserFilter()); 
     if(User.getSelectedUser() != null) { 
      userList.getSelectionModel().select(User.getSelectedUser()); 
     } 
    } 
} 

private FilteredList<Group> createGroupFilter() { 
    System.out.println("start createGroupFilter(); " + Group.getSelectedGroup()); //TROUBLESHOOTING 
    groups = MainScreenModel.getGroups(); 
    FilteredList<Group> filteredGroups = new FilteredList<Group>(groups, s -> true); 
    groupSearchTxt.textProperty().addListener(obs -> { 
     String filter = groupSearchTxt.getText().toLowerCase(); 
     if(filter == null || filter.trim().length() == 0) { 
      filteredGroups.setPredicate(s -> true); 
     } else { 
      filteredGroups.setPredicate(s -> s.toString().toLowerCase().contains(filter)); 
     } 
    }); 
    System.out.println("end createGroupFilter(); " + Group.getSelectedGroup()); //TROUBLESHOOTING 
    return filteredGroups; 
} 

这提供了以下的输出:

before groupList.setItems(createGroupFilter()); Group 1 
start createGroupFilter(); Group 1 
end createGroupFilter(); Group 1 
after groupList.setItems(createGroupFilter()); null 

所以,在我看来,在groupList.setItems()......是什么原因造成的问题。

仅供参考,这里是MainScreenModel.getGroups()方法:

public static ObservableList<Group> getGroups() { 
    ObservableList<Group> groups = FXCollections.observableArrayList(); 
    try { 
     PreparedStatement stmt = DatabaseConnection.getConnection() 
       .prepareStatement("SELECT * FROM groups ORDER BY group_name ASC"); 
     ResultSet rs = stmt.executeQuery(); 
     while(rs.next()) { 
      String gn = rs.getString("GROUP_NAME"); 
      String desc = rs.getString("DESCRIPTION"); 
      groups.add(new Group(gn, desc)); 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return groups; 
} 

,也是我的组类:

public class Group { 

    private static Group selectedGroup; 

    private final StringProperty groupName = new SimpleStringProperty(); 
    private final StringProperty description = new SimpleStringProperty(); 

    public Group(String hn, String desc) { 
     setGroupName(hn); 
     setDescription(desc); 
    } 

    public StringProperty hostNameProperty() { 
     return this.groupName; 
    } 

    public String getGroupName() { 
     return this.groupName.get(); 
    } 

    public void setGroupName(String hn) { 
     this.groupName.set(hn); 
    } 

    public StringProperty descriptionProperty() { 
     return this.description; 
    } 

    public String getDescription() { 
     return this.description.get(); 
    } 

    public void setDescription(String desc) { 
     this.description.set(desc); 
    } 

    public static Group getSelectedGroup() { 
     return selectedGroup; 
    } 

    public static void setSelectedGroup(Group group) { 
     selectedGroup = group; 
    } 

    @Override 
    public String toString() { 
     return this.groupName.get(); 
    } 

} 
+2

setSelectedGroup()方法是否曾将其设置为null? – NormR

+3

我看不到你设置它的地方,或者我错过了什么? – Itai

+1

我当时说的是一样的,你在哪里填充静态Group selectedGroup;' –

回答

6

我看不到任何地方,你在你的代码中调用setSelectedGroup。由于selectedGroup默认初始化为null,如果您不拨打setSelectedGroup,它将保持null

在另一方面,如果(因为它似乎)selectedGroup是在某些点非空,那么一些代码你还没有告诉我们必须调用该方法。 Java变量不会自发地改变它的值。

所以....


为什么我的静态变量被设置为空?

东西必须调用setSelectedGroup某处有null参数。

因此,在我看来,groupList.setItems()...是什么导致问题。

这似乎是合理的。也有可能是别的原因造成的;例如另一个线程。


1 - 这是问题所在。

+0

查看我的编辑,感谢您的帮助:) – ColonelSpuds

相关问题