2016-06-13 8 views
1

EDIT 1: Ich denke, ich habe es herausgefunden.Java - Warum wird meine statische Variable auf null gesetzt?

Hier ist meine Methode initialize()

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

Ich denke, dass, wenn ich die Gruppenliste Listview diese selectedItemProperty Zuhörer neu laden aufgerufen wird und wenn er auf null.

Ich habe dieses Problem behoben durch Hinzufügen einer if Zustand im Inneren des Hörers:

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(); 
     } 
    }); 

Aus irgendeinem Grund meine statische ‚selectedGroup‘ Variable wird auf Null, und ich kann nicht herausfinden, warum.

Ich habe die folgende Fehlersuche durchgeführt.

Ich habe eine Methode namens 'refresh()', die eine Methode namens 'createGroupFilter()' aufruft. Ich habe die folgenden System.out.println-Anweisungen eingefügt, um zu sehen, wann die Variable beendet wird.

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; 
} 

Dies liefert die folgende Ausgabe:

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

So scheint es mir, dass die groupList.setItems() ... ist das, was das Problem verursacht.

Als Referenz ist hier die MainScreenModel.getGroups() -Methode:

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; 
} 

und meine Fraktion Klasse auch:

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

Ist die Methode setSelectedGroup() jemals auf null gesetzt? – NormR

+3

Ich kann keinen Ort sehen, an dem du es einstellst, oder fehlt mir etwas? – Itai

+1

Ich wollte ungefähr das selbe sagen, wo füllst du 'statische Gruppe selectedGroup;' –

Antwort

6

Ich kann nicht überall sehen, dass Sie setSelectedGroup in Ihrem Code aufrufen. Da selectedGroup standardmäßig auf null initialisiert wird, bleibt es null, wenn Sie nicht setSelectedGroup anrufen.

Auf der anderen Seite, wenn (wie es scheint) selectedGroup nicht-null an bestimmten Punkten, dann haben einige Code , dass Sie uns nicht gezeigt Aufruf der Methode werden müssen. Eine Java-Variable ändert ihren Wert nicht spontan.

So ....


Warum ist meine statische Variable gesetzt wird, auf null?

Etwas muss setSelectedGroup irgendwo mit einem null Parameter anrufen.

So scheint es mir, dass die groupList.setItems() ... ist, was das Problem verursacht.

Das ist plausibel.Es ist auch möglich, dass etwas anderes es verursacht; z.B. ein anderer Thread.


1 - Das war das Problem.

+0

Siehe meine Bearbeitung, danke für Ihre Hilfe :) – ColonelSpuds