2016-12-24 8 views
2

Когда я нажимаю на кнопку переключения и ввод текста, а затем нажимаю ту же самую кнопку переключения (вкл./Выкл.), Сохраняет текст текстовой области в хэш-карте с идентификатором кнопки, но, например, когда Я нажимаю кнопку переключения и добавляю текст в текстовое поле и нажимаю другую кнопку переключения, вместо того, чтобы нажимать то же самое, значение не добавляется в hashmap, а текст textarea теряется.сохранение значений textarea в hashmap для каждой кнопки переключения 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 не срабатывает для ToggleButton с, которые невыбранные, когда другой Toggle в той же группе получает выбран.

Кроме того, хранение данных в Map кажется ненужным. Вы создаете один из EventHandler<ActionEvent> за кнопку, никогда не изменяете кнопки id и только записываете ключ, соответствующий идентификатору кнопки. Поле будет делать тот же трюк.

Однако я рекомендую делать, добавив ChangeListener к ToggleGroup вместо, который позволяет получить Toggle, который невыбранные и Toggle, который выбран в одном случае. Кроме того, добавление идентификатора как 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(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^