2016-12-24 43 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(); 
}