2016-10-28 14 views
1

라디오 버튼을 사용하여 RGB 색상을 선택하고 슬라이더를 사용하여 값을 0 - 255로 변경할 수있는 프로그램을 만들려고합니다. 색상 변경은 텍스트에 적용되어야합니다. R, G 또는 B를 선택한 경우 선택한 색상 만 텍스트에 있어야합니다 (예 : 녹색을 선택하면 빨간색과 파란색 값은 0).슬라이더를 사용하여 텍스트 색상 변경

현재 프로그램은 어느 정도 작동합니다. 예를 들어, 슬라이더가 값 150에 있고 새 색상을 선택한 다음 슬라이더를 움직이면 텍스트 색상이 150으로 설정되거나 슬라이더가 설정된 값으로 설정됩니다. 새로운 가치. 업데이트하려면 슬라이더를 이동하기 전에 새 색상을 선택해야합니다. 선택한 색상별로 한 번만 업데이트됩니다. 선택한 색상을 완벽하게 업데이트하고 싶습니다. 아래 코드 예 :

public class Oblig5 extends Application { 

    static int colorValue = 0; 
    static int red = 0; 
    static int green = 0; 
    static int blue = 0; 

    public static void main(String[] args) { 

     launch(args); 

    } 

    public void start(Stage primaryStage) { 
     // Create panes 
     BorderPane bPane = new BorderPane(); 
     VBox vBox = new VBox(); 
     bPane.setLeft(vBox); 

     // Create text and place it in the pane 
     Text text = new Text("Oblig 5"); 
     text.setFont(Font.font("Times New Roman", FontWeight.NORMAL, FontPosture.REGULAR, 40)); 
     bPane.setCenter(text); 

     // Create radio buttons and place them in the VBox 
     RadioButton rbRed = new RadioButton("Red"); 
     RadioButton rbGreen = new RadioButton("Green"); 
     RadioButton rbBlue = new RadioButton("Blue"); 


     ToggleGroup group = new ToggleGroup(); 
     rbRed.setToggleGroup(group); 
     rbGreen.setToggleGroup(group); 
     rbBlue.setToggleGroup(group); 

     // Create handlers for radiobuttons 
     rbRed.setOnAction(e -> { 
      if (rbRed.isSelected()) { 
       red = colorValue; 
       green = 0; 
       blue = 0; 
      } 
     }); 

     rbGreen.setOnAction(e -> { 
      if (rbGreen.isSelected()) { 
       red = 0; 
       green = colorValue; 
       blue = 0; 
      } 
     }); 

     rbBlue.setOnAction(e -> { 
      if (rbBlue.isSelected()) { 
       red = 0; 
       green = 0; 
       blue = colorValue; 
      } 
     }); 

     vBox.getChildren().addAll(rbRed, rbGreen, rbBlue); 

     // Create a slider and place it in the BorderPane 
     Slider slider = new Slider(0, 255, 135); 
     slider.setShowTickLabels(true); 
     slider.setShowTickMarks(true); 
     bPane.setBottom(slider); 
     bPane.setAlignment(slider, Pos.CENTER); 

     // Create a handler for the slider 
     slider.valueProperty().addListener(ov -> { 
      colorValue = (int) slider.getValue(); 
      text.setFill(Color.rgb(red, green, blue)); 
     }); 

     // Create a scene and place it in the stage 
     Scene scene = new Scene(bPane, 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.setTitle("Oblig 5"); 
     primaryStage.show(); 

    } 

} 

모든 입력 사항을 높이 평가합니다!

답변

5

[주의 : @fabian은이 글을 쓰는 동안 답변을 게시했습니다. 어느 쪽이든 대답이 효과가있다. 약간 다른 기법을 보여주기 때문에 나는 이것을 게시 할 것이라고 생각했다. JavaFX의 일반적인 경우처럼 여러 가지 좋은 방법이 있습니다.]

선택한 버튼이 변경되거나 슬라이더 값이 변경되면 텍스트 채우기에 적절한 값을 설정해야합니다. 현재 선택된 버튼이 변경되면 red, greenblue (텍스트 채우기는 변경하지 않음) 변수 만 업데이트하고 슬라이더 값이 변경되면 red, greenblue을 사용하여 setFill(...)을 호출합니다 변수의 값을 변경하지 마십시오.

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.RadioButton; 
import javafx.scene.control.Slider; 
import javafx.scene.control.ToggleGroup; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.text.Font; 
import javafx.scene.text.FontPosture; 
import javafx.scene.text.FontWeight; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class Oblig5 extends Application { 

    public static void main(String[] args) { 

     launch(args); 

    } 

    public void start(Stage primaryStage) { 
     // Create panes 
     BorderPane bPane = new BorderPane(); 
     VBox vBox = new VBox(); 
     bPane.setLeft(vBox); 

     Text text = new Text("Oblig 5"); 
     text.setFont(Font.font("Times New Roman", FontWeight.NORMAL, FontPosture.REGULAR, 40)); 
     bPane.setCenter(text); 

     RadioButton rbRed = new RadioButton("Red"); 
     RadioButton rbGreen = new RadioButton("Green"); 
     RadioButton rbBlue = new RadioButton("Blue"); 


     ToggleGroup group = new ToggleGroup(); 
     rbRed.setToggleGroup(group); 
     rbGreen.setToggleGroup(group); 
     rbBlue.setToggleGroup(group); 

     vBox.getChildren().addAll(rbRed, rbGreen, rbBlue); 

     Slider slider = new Slider(0, 255, 135); 
     slider.setShowTickLabels(true); 
     slider.setShowTickMarks(true); 
     bPane.setBottom(slider); 
     BorderPane.setAlignment(slider, Pos.CENTER); 

     // Create a handler for the updating text fill: 
     ChangeListener<Object> updateListener = (obs, oldValue, newValue) -> { 
      int colorValue = (int) slider.getValue() ; 
      int red = rbRed.isSelected() ? colorValue : 0 ; 
      int green = rbGreen.isSelected() ? colorValue : 0 ; 
      int blue = rbBlue.isSelected() ? colorValue : 0 ; 
      text.setFill(Color.rgb(red, green, blue)); 
     }; 
     slider.valueProperty().addListener(updateListener); 
     group.selectedToggleProperty().addListener(updateListener); 

     // Create a scene and place it in the stage 
     Scene scene = new Scene(bPane, 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.setTitle("Oblig 5"); 
     primaryStage.show(); 

    } 


} 
4

토글에 userData으로 사용하도록 Color을 설정할 수 있습니다.

// create radio buttons and add color at full brightness 
RadioButton rbRed = new RadioButton("Red"); 
rbRed.setUserData(Color.RED); 
RadioButton rbGreen = new RadioButton("Green"); 
rbGreen.setUserData(Color.LIME); 
RadioButton rbBlue = new RadioButton("Blue"); 
rbBlue.setUserData(Color.BLUE); 

ToggleGroup group = new ToggleGroup(); 
rbRed.setToggleGroup(group); 
rbGreen.setToggleGroup(group); 
rbBlue.setToggleGroup(group); 

group.selectToggle(rbRed); 

... 

// create binding based on toggle user data and slider value 
text.fillProperty().bind(Bindings.createObjectBinding(() -> { 
    Color color = (Color) group.getSelectedToggle().getUserData(); 

    // use color determined by toggle with brightness adjusted based on slider value 
    return color.deriveColor(0, 1, slider.getValue()/slider.getMax(), 1); 
}, slider.valueProperty(), group.selectedToggleProperty())); 

주를이 코드를 사용하는 청취자를 유지 할 필요가 없습니다 니펫 것을 : 이렇게하면 슬라이더의 값에 따라 텍스트와 선택 토글의 fill 속성에 바인딩을 만들 수 있습니다. 특히 바운드 프로퍼티를 할당하려고 시도하면 예외가 발생하므로 텍스트 채우기를 업데이트하는 리스너는 제거되어야합니다.

+0

답장을 보내 주셔서 감사합니다! 청취자의 사용이 가르쳐지는 것은 학교 임무이기 때문에, 다른 답은 해결책으로 선택 될 수있는 장소가 더 많았습니다. 나는 어쨌든 당신의 대답이 좋은 길로 보이기 때문에 나는 upvote를주었습니다. – Esben86