2013-07-13 4 views
0

Я работаю на этом примере, который не работает должным образом:Как изменить Прямоугольники с кнопками

public class test extends Application 
{ 

    private void init(Stage primaryStage) 
    { 

     Group root = new Group(); 
     primaryStage.setScene(new Scene(root)); 

     String pillButtonCss = DX57DC.class.getResource("PillButton.css").toExternalForm(); 

     // create 3 toggle buttons and a toogle group for them 
     ToggleButton tb1 = new ToggleButton("Left Button"); 
     tb1.setId("pill-left"); 
     ToggleButton tb2 = new ToggleButton("Center Button"); 
     tb2.setId("pill-center"); 
     ToggleButton tb3 = new ToggleButton("Right Button"); 
     tb3.setId("pill-right"); 

     final ToggleGroup group = new ToggleGroup(); 
     tb1.setToggleGroup(group); 
     tb2.setToggleGroup(group); 
     tb3.setToggleGroup(group); 
     // select the first button to start with 
     group.selectToggle(tb1); 

     ////////////////////////////////////////// 

     final VBox vbox = new VBox(); 

     final Rectangle rect1 = new Rectangle(300, 300); 
     rect1.setFill(Color.ALICEBLUE); 
     final Rectangle rect2 = new Rectangle(300, 300); 
     rect2.setFill(Color.AQUA); 
     final Rectangle rect3 = new Rectangle(300, 300); 
     rect3.setFill(Color.AZURE); 

     tb1.setUserData(rect1); 
     tb2.setUserData(rect2); 
     tb3.setUserData(rect3); 

     group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends Toggle> ov, Toggle toggle, Toggle new_toggle) 
      { 
       if (new_toggle == null) 
       { 
        //rect.setFill(Color.WHITE); 
       } 
       else 
       { 
        vbox.getChildren().addAll((Node[]) group.getSelectedToggle().getUserData()); 
        //rect.setFill((Color) group.getSelectedToggle().getUserData()); 
       } 
      } 
     }); 


     /////////////////////////////////////////// 


     HBox hBox = new HBox(); 
     hBox.getChildren().addAll(tb1, tb2, tb3); 
     hBox.setPadding(new Insets(20, 20, 260, 20)); 
     hBox.getStylesheets().add(pillButtonCss); 



     vbox.getChildren().add(hBox); 
     //vbox.getChildren().add(rect); 

     root.getChildren().add(vbox); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     init(primaryStage); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 
} 

Я хочу создать несколько Прямоугольники (или объект, в котором или объект), в котором я хочу, чтобы хранить данные , Я хочу переключить прямоугольники (объекты), которые отображаются перед пользователем с помощью кнопок. Пример, который я реализовал, работает некорректно. Можете ли вы сказать мне, что является правильным способом реализации этого?

ответ

1

Вы можете создать Stackpane с прямоугольником и ярлыком с текстом поверх него (если это данные, которые вы хотите сохранить). В качестве альтернативы вы также можете установить для фона любой панели прямоугольный прямоугольник.

Затем добавьте эту панель в качестве Userdata к соответствующей кнопке и добавьте кнопки userdata в ваш VBox при переключении.

final StackPane rect1pane = new StackPane(); 
final Rectangle rect1 = new Rectangle(300, 300); 
rect1pane.getChildren().add(rect1); 
rect1pane.getChildren().add(new Label("Some text")); 
tb1.setUserData(rect1pane); 

togglePropertyListener:

... 
else{ 
//Delete rectangles added before (or check if this one isnt already dispayed) 
if(group.getSelectedToggle().getUserData() instanceof Node) 
    vbox.getChildren().add((Node)group.getSelectedToggle().getUserData()); 
} 

Если вы просто хотите, чтобы ваш пример кода для работы изменения:

vbox.getChildren().addAll((Node[]) group.getSelectedToggle().getUserData());

в

vbox.getChildren().addAll((Node) group.getSelectedToggle().getUserData()); 

Поскольку вы просто добавляете Прямоугольник выбранного ToggleButton, это только один, а не массив.

Сделайте свое окно большим после щелчка, чтобы увидеть rectanlge (нижнее дополнение 260px не помогает, потому что, даже если пространство пустое ниже hbox, оно все еще является частью hbox и не может использоваться вашим добавленным прямоугольником) или просто переместить

group.selectToggle(tb1); 

к последней строке метода инициализации;)