Java - 为什么我的静态变量被设置为空?
编辑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();
}
}
我看不到任何地方,你在你的代码中调用setSelectedGroup
。由于selectedGroup
默认初始化为null
,如果您不拨打setSelectedGroup
,它将保持null
。
在另一方面,如果(因为它似乎)selectedGroup
是在某些点非空,那么一些代码你还没有告诉我们必须调用该方法。 Java变量不会自发地改变它的值。
所以....
为什么我的静态变量被设置为空?
东西必须调用setSelectedGroup
某处有null
参数。
因此,在我看来,groupList.setItems()...是什么导致问题。
这似乎是合理的。也有可能是别的原因造成的;例如另一个线程。
1 - 这是问题所在。
查看我的编辑,感谢您的帮助:) – ColonelSpuds
setSelectedGroup()方法是否曾将其设置为null? – NormR
我看不到你设置它的地方,或者我错过了什么? – Itai
我当时说的是一样的,你在哪里填充静态Group selectedGroup;' –