2016-06-13 95 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

相關問題