2016-06-13 11 views
1

編集1:私はそれを理解したかもしれないと思う。Java - なぜ静的変数がnullに設定されていますか?

は、ここに私のinitialize()メソッド

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

私はここで、groupListリストビューを再ロードするとき、このselectedItemPropertyリスナーが呼び出されていることを考えると、それはnullに設定しています。

私は、リスナー内であれば条件を追加することによって、これを修正した:私の静的な「selectedGroup」変数が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(); 
     } 
    }); 

を。

以下のトラブルシューティングを実施しました。

私は、 'createGroupFilter()'というメソッドを呼び出す 'refresh()'というメソッドを持っています。私は、変数がNULLになっているかどうかを確認するために、次の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

私は同じことを言っていました。静的グループselectedGroup;を埋めています。 –

答えて

6

は、私はあなたのコードでsetSelectedGroupを呼び出すことをどこでも見ることができません。 selectedGroupはデフォルトでnullに初期化されているため、setSelectedGroupを呼び出さないとnullのままになります。

一方、selectedGroup(それが表示される)場合は、あなたがは、メソッドを呼び出すされなければならない私たちに示していないこと、その後いくつかのコード、特定の時点で非nullです。 Java変数は自発的にその値を変更しません。

ので....


はなぜ静的変数はnullに設定されていますか?

何かがnullパラメータを使用してどこかでsetSelectedGroupを呼び出す必要があります。

したがって、groupList.setItems()は問題を引き起こしているようです。

そう考えられます。他の何かがそれを引き起こしている可能性もあります。例えば別のスレッド。


1 - それが問題でした。

+0

あなたの助けを借りて私の編集を参照してください:) – ColonelSpuds

関連する問題