2016-12-24 5 views
2

토글 버튼을 클릭하고 텍스트를 입력 한 다음 동일한 토글 버튼을 누르면 (on/off) 버튼 ID가있는 해시 맵에 텍스트 영역 텍스트가 저장됩니다 (예 : 토글 버튼을 눌러 textarea에 텍스트를 추가하고 다른 토글 버튼을 누르지 않고 값을 hashmap에 추가하지 않고 textarea 텍스트를 잃어 버립니다. 여기 각 토글 버튼에 대한 해시 맵에 텍스트 영역 값 저장 javafx

Node componentsPane; 
int x = 14, y = 0; 
ToggleGroup group = new ToggleGroup(); 
Integer id = 1; 
String temp; 
String tempmessageText = null; 

public void initialize() throws SQLException { 

    componentsPane = splitPane.getItems().get(1); 

    final Statement stmt = null; 
    String m = ""; 

    final String query = "select username from chatuser "; 
    final Connection conn = null; 

    final Connection _connection = DriverManager.getConnection("jdbc:postgresql://IP/postgres", "postgres", 
      "password"); 
    @SuppressWarnings("resource") 
    final PreparedStatement _stmt = _connection.prepareStatement(query); 
    final ResultSet res = _stmt.executeQuery(); 
    while (res.next()) { 
     m = res.getString("username"); 
     final ToggleButton btn = new ToggleButton(); 
     btn.setLayoutX(x); 
     btn.setLayoutY(y + 180); 
     btn.setText(m); 
     btn.setId(id.toString()); 
     btn.setToggleGroup(group); 
     splitPaneLeft.getChildren().add(btn); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      HashMap<Integer, String> hmap = new HashMap<Integer, String>(); 

      @Override 
      public void handle(final ActionEvent event) { 
       System.out.println(btn.getId()); 

       if (btn.isSelected()) { 

        temp = btn.getId(); 
        System.out.println("yes"); 

        splitPane.getItems().remove(componentsPane); 

        splitPane.getItems().add(1, componentsPane); 

        smsBox.setText(hmap.get(Integer.parseInt(temp))); 

        Main.getPrimaryStage().setMaxWidth(840); 
        Main.getPrimaryStage().setWidth(810); 
        Main.getPrimaryStage().setMinWidth(400); 

       } else { 
        System.out.println("no"); 

        splitPane.getItems().remove(componentsPane); 

        Main.getPrimaryStage().setResizable(false); 
        Main.getPrimaryStage().setMaxWidth(400); 
        System.out.println(smsBox.getText()); 
        hmap.put(Integer.parseInt(btn.getId()), smsBox.getText()); 
       } 

      } 
     }); 
     y += 35; 
     id++; 

    } 

} 

boolean k; 

@FXML 
private void func() { 
    System.out.println(group.getSelectedToggle()); 

    if (!group.getSelectedToggle().equals(null)) { 

     splitPane.getItems().add(1, componentsPane); 
     splitPane.setDividerPosition(1, 0.1); 

     Main.getPrimaryStage().setMaxWidth(840); 
     Main.getPrimaryStage().setWidth(810); 
     Main.getPrimaryStage().setMinWidth(400); 

    } 

    else { 
     System.out.println("false"); 
     System.out.println(splitPane.getItems()); 

     System.out.println(Main.getPrimaryStage().getHeight()); 

    } 
} 

답변

0

onAction가 같은 그룹의 다른 Toggle이 선택됩니다 때 선택되지 않은 있습니다 ToggleButton 초 동안 트리거되지 않습니다 조언을 주시기 바랍니다 내 코드입니다.

Map에 데이터를 저장할 필요가 없습니다. 버튼 하나당 EventHandler<ActionEvent>을 만들고 버튼의 id을 수정하지 말고 버튼의 id에 해당하는 키에만 씁니다. 필드는 같은 트릭을 할 것입니다.

그러나 나는 ChangeListener 당신이 선택되지 않은 인 Toggle 및 단일 이벤트에서 선택한 Toggle를 얻을 수 있습니다 대신 ToggleGroup에 추가하여 수행하는 것이 좋습니다. 또한 ID를 userData으로 추가하면 문자열로 변환하고 문자열에서 파싱하는 대신 유형을 유지할 수 있습니다 ...

@Override 
public void start(Stage primaryStage) { 
    List<String> strings = Arrays.asList("a", "b", "c"); 
    ToggleGroup group = new ToggleGroup(); 

    TextArea textArea = new TextArea(); 
    textArea.setEditable(false); 
    VBox root = new VBox(textArea); 

    int id = 0; 

    Map<Integer, String> data = new HashMap<>(); 

    for (String m : strings) { 
     ToggleButton btn = new ToggleButton(m); 
     btn.setUserData(id++); 
     btn.setToggleGroup(group); 
     root.getChildren().add(btn); 
    } 

    // listen to selection of a different toggle to store data for the old toggle/
    // display stored data for the new toggle 
    group.selectedToggleProperty().addListener((observable, oldValue, newValue) -> { 
     textArea.setEditable(newValue != null); 
     if (oldValue != null) { 
      data.put((Integer) oldValue.getUserData(), textArea.getText()); 
     } 
     if (newValue != null) { 
      textArea.setText(data.get(newValue.getUserData())); 
     } 
    }); 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
}