2016-12-24 12 views
2

トグルボタンをクリックしてテキストを入力してから同じトグルボタンを押すと、ボタンエリアでハッシュマップにテキストエリアのテキストが保存されます。私はトグルボタンを押して、テキストエリアにテキストを追加し、他のトグルボタンを押すのではなく、値がハッシュマップに追加されず、テキストエリアが失われます。ここ各トグルボタンのハッシュマップにテキストエリアの値を保存する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>を1つ作成し、ボタンのidを変更せず、ボタンのIDに対応するキーにのみ書き込みます。フィールドは同じトリックを行うだろう。

しかし、私はあなたが選択されていないと、単一のイベントで選択されているToggleToggleを取得することを可能にする、代わりにToggleGroupChangeListenerを追加することによって行うことをお勧めします。さらに、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(); 
} 
関連する問題