2016-12-24 143 views
2

當我點擊切換按鈕並輸入文本,然後按下相同的切換按鈕 - (開/關)將textarea文本保存在帶有按鈕id的hashmap中,但是例如當我按切換按鈕,並添加文本到textarea,並按其他切換按鈕,而不是按相同的,值不會添加到hashmap和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不觸發ToggleButton■當同組另一Toggle被選中是不選。

此外將數據存儲在Map中似乎沒有必要。您爲每個按鈕創建一個EventHandler<ActionEvent>,不要修改按鈕的id,只寫入與該按鈕ID相對應的按鍵。一個領域會做同樣的把戲。

但是,我建議您通過在ToggleGroup中添加ChangeListener來代替,這樣您可以獲取未選中的Toggle和在單個事件中選擇的Toggle。此外,添加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(); 
}