2013-02-14 53 views
3

當爲實際已經選擇的RadioButton調用ToggleGroup.selectToggle(Toggle toggle)時,該RadioButton變爲未選中狀態。我覺得這是一個錯誤,任何人都可以證實這一點?ToggleGroup.select切割錯誤?

toggle.fxml:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 

<VBox prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.ToggleDemoController"> 
    <children> 
    <RadioButton mnemonicParsing="false" selected="true" text="First RadioButton"> 
     <toggleGroup> 
     <ToggleGroup fx:id="myToggleGroup" /> 
     </toggleGroup> 
    </RadioButton> 
    <RadioButton mnemonicParsing="false" text="Second RadioButton" toggleGroup="$myToggleGroup" /> 
    </children> 
</VBox> 

ToggleDemoController:

package com.example; 

import javafx.fxml.FXML; 
import javafx.scene.control.ToggleGroup; 

public class ToggleDemoController 
{ 
    @FXML 
    private ToggleGroup myToggleGroup; 

    // Implementing Initializable Interface no longer required according to 
    // http://docs.oracle.com/javafx/2/fxml_get_started/whats_new2.htm 
    @SuppressWarnings("unused") // only called by FXMLLoader 
    @FXML 
    private void initialize() 
    { 
     // Select the currently selected toggle (that is the first RadioButton) again. 
     // This unselects the first RadioButton, while one would expect it to stay selected. 
     myToggleGroup.selectToggle(myToggleGroup.getSelectedToggle()); 
    } 


} 

代碼也在http://codestefan.googlecode.com/svn/trunk/ToggleDemo

感謝您的任何提示可用!

更新:

這裏有一個解決方法我想通了:

而不是

myToggleGroup.selectToggle(myToggleGroup.getSelectedToggle()); 

使用

Toggle selectedToggle = myToggleGroup.getSelectedToggle(); 
int selectedToggleIndex = myToggleGroup.getToggles().indexOf(selectedToggle); 
myToggleGroup.getToggles().get(selectedToggleIndex).setSelected(true); 

或者換句話說:不要ToggleGroup.selectToggle使用Toggle.setSelected。猜測在這種情況下,並不需要所有的索引,但是如果索引存儲在數據庫中,我需要選擇一個切換來恢復我的應用程序,所以這是根據我的情況進行調整的。

可能的解決方法2(!):

接取的切換後面的控制,例如一個RadioButton,並以編程方式取消選中該選項。見Link between Toggle and e.g. the RadioButton behind it?

+0

解決方法是好的,但如果你可以考慮使用的結合,而不是制定者,你要小心:http://javafx-jira.kenai.com/browse/RT-17205。 – 2013-02-14 23:08:21

+0

幸運的是,對於我的小應用程序,我個人不會使用綁定,但感謝提示,可能對其他讀者仍然有用:-) – 2013-02-14 23:10:13

+0

似乎在第一個解決方法中索引的東西根本不起作用。在我的JavaFX應用程序中,至少,'toggleGroup.getToggles()。indexOf(toggleGroup.getSelectedToggle())'總是返回-1(這就是我偶然發現這個問題的原因,因爲我一直在尋找如何獲得索引) 。 – 2017-10-08 17:54:08

回答

0

是的。你發現了一個錯誤。

文件是針對在運行系統項目:http://javafx-jira.kenai.com

請確保您有一個鏈接回這種情況下,提供一些可重複的示例代碼,因爲它似乎有些similar issues已經被關閉,因爲開發商無法重現問題。

這裏是一個複製只使用Java和無FXML的bug一個一些示例代碼 - 使用JavaFX 2.2.5和Java8b76行爲是奇怪和馬車IMO:

import javafx.application.Application; 
import static javafx.application.Application.launch; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.*; 
import javafx.scene.control.Button; 
import javafx.scene.control.RadioButton; 
import javafx.scene.control.ToggleGroup; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class ToggleTest extends Application { 
    @Override public void start(Stage primaryStage) { 
     final ToggleGroup tg = new ToggleGroup(); 
     RadioButton radio1 = new RadioButton("1"); 
     radio1.setId("1"); 
     radio1.setToggleGroup(tg); 
     RadioButton radio2 = new RadioButton("2"); 
     radio2.setId("2"); 
     radio2.setToggleGroup(tg); 

     tg.selectToggle(radio1); 
//  radio1.setSelected(true); 

     Button button = new Button("Select 1"); 
     button.setOnAction(new EventHandler<ActionEvent>() { 
      @Override public void handle(ActionEvent t) { 
       System.out.println("Selected Toggle Before Select: " + tg.getSelectedToggle() + " isSelected? " + tg.getSelectedToggle().isSelected()); 
       tg.selectToggle(tg.getSelectedToggle()); 
       System.out.println("Selected Toggle After Select: " + tg.getSelectedToggle() + " isSelected? " + tg.getSelectedToggle().isSelected()); 
      } 
     }); 

     VBox layout = new VBox(10); 
     layout.getChildren().addAll(radio1, radio2, button); 
     layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;"); 

     primaryStage.setScene(new Scene(layout)); 
     primaryStage.show(); 
    } 
    public static void main(String[] args) { launch(args); } 
} 

程序輸出經過反覆按下按鈕:

Selected Toggle Before Select: RadioButton[id=1, styleClass=radio-button] isSelected? true 
Selected Toggle After Select: RadioButton[id=1, styleClass=radio-button] isSelected? false 
Selected Toggle Before Select: RadioButton[id=1, styleClass=radio-button] isSelected? false 
Selected Toggle After Select: RadioButton[id=1, styleClass=radio-button] isSelected? false 
Selected Toggle Before Select: RadioButton[id=1, styleClass=radio-button] isSelected? false 
Selected Toggle After Select: RadioButton[id=1, styleClass=radio-button] isSelected? false 
+1

http://javafx-jira.kenai.com/browse/RT-28412 – 2013-02-14 22:57:03

+0

謝謝你們兩位!我想ToggleGroup.selectToggle不執行一些ChangeListener,因爲選擇一個已經選擇的RadioButton不是一個改變,但仍然有一些其他的監聽器被執行或誰知道還有什麼......任何方式感謝將它轉換爲普通的Java併發布它,我們所有人都很好的團隊合作:P – 2013-02-14 23:07:56