【问题标题】:saving textarea values in hashmap for each toggle button javafx为每个切换按钮 javafx 在 hashmap 中保存 textarea 值
【发布时间】:2017-05-10 02:24:26
【问题描述】:

当我单击切换按钮并输入文本然后按下相同的切换按钮时 - (开/关)将 textarea 文本保存在带有按钮 ID 的哈希图中,但例如当我按下切换按钮并将文本添加到textarea 并按下其他切换按钮而不是按下相同的按钮,该值不会添加到 hashmap 并且 textarea 文本会丢失。

这是我的代码,请指教

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());

    }
}

【问题讨论】:

    标签: java javafx hashmap toggle


    【解决方案1】:

    onAction 不会在同一组中的另一个 Toggle 被选中时为未选中的 ToggleButtons 触发。

    此外,将数据存储在Map 中似乎没有必要。您为每个按钮创建一个EventHandler&lt;ActionEvent&gt;,从不修改按钮的id,只写入与按钮ID 对应的键。一个字段可以做同样的事情。

    但是,我建议您改为将ChangeListener 添加到ToggleGroup,这样您就可以在单个事件中获得未选中的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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      相关资源
      最近更新 更多