ABOUT ME

Today
Yesterday
Total
  • [JAVA FX] Button 컨트롤
    Programming/JAVA 2020. 11. 4. 14:54
    package application1;
    
    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.effect.DropShadow;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.layout.HBox;
    import javafx.stage.Stage;
    
    
    public class Main extends Application {
    	@Override
    	public void start(Stage primaryStage) throws Exception {
    		HBox root=new HBox();//컨테이너인 HBOX를 만들어서
    		root.setAlignment(Pos.CENTER);//ROOT의 컨트롤들의 정렬을 가운데로 줍니다.
    		root.setPrefSize(300,200);
    		
    		
    		Button btn1 = new Button("Hello");
    		btn1.setOnAction(new EventHandler<ActionEvent>() {
    			public void handle(ActionEvent e) {
    				if(btn1.getText().equals("Hello")) {
    					btn1.setText("Accept");
    				}
    				else {
    					btn1.setText("Hello");
    				}
    			}
    		});
    		
    		Button btn2 = new Button("Accept");
    		DropShadow shadow=new DropShadow();
    		
    		btn2.setOnMouseEntered(new EventHandler<MouseEvent>() {
    			public void handle(MouseEvent e) {
    				btn2.setEffect(shadow);
    			}
    		});
    		
    		btn2.setOnMouseExited(e->btn2.setEffect(null));
    		HBox.setMargin(btn2,new Insets(10));
    		//람다식으로 구현한 이벤트 처리 메서드,
    		//람다식 정리할 것.
    		
    		
    		
    		//shadow 버튼 효과에 그림자를 주고 싶습니다.
    		//버튼에 마우스커서가 들어가면 그림자!
    		
    		Image imgOK=new Image(this.getClass()
    				.getResourceAsStream("Check_16x16.png"));
    		//getClass로 언어와 getResoure
    		Image imgDel=new Image(this.getClass()
    				.getResourceAsStream("Delete_16x16.png"));
    		Button btn3= new Button("Accept",new ImageView(imgOK));
    		//Button("setText()",imageview object);
    		btn3.setOnAction(event->{
    			if (btn3.getText().equals("Hello")){
    				btn3.setText("Aceept");
    				btn3.setGraphic(new ImageView(imgOK));
    			}
    			else {
    				btn3.setText("Hello");
    				btn3.setGraphic(new ImageView(imgDel));
    			}
    		});
    		
    		//FileInputStream inputstream = new FileInputStream("img.jpg");
    		//Image img = new Image(inputstream);
    		//ImageView imgView = new ImageView(img);
    		//이런식으로 생성을 하는 방법도 있다.
    		//이미지는 자체로 이미지를 띄우는 기능이 없기 때문에
    		//이비지 view객체를 만들어야 띄울 수 있다.
    		//상기 방법도 맞는 방법이다.
    		
    		
    		root.getChildren().addAll(btn1, btn2, btn3);
    		
    		Scene scene=new Scene(root);
    		
    		primaryStage.setTitle("ButtonExample");
    		primaryStage.setScene(scene);
    		primaryStage.show();
    	}
    	public static void main(String[] args) {
    		launch(args);
    	}
    }
    

     

     

     

     

    Button btn1 = new Button("Hello");
    		btn1.setOnAction(new EventHandler<ActionEvent>() {
    			public void handle(ActionEvent e) {
    				if(btn1.getText().equals("Hello")) {
    					btn1.setText("Accept");
    				}
    				else {
    					btn1.setText("Hello");
    				}
    			}
    		});

     

    이 부분은 Button을 생성해서 setOnAction 이라는 메서드로 EventHandler를 내부 익명 클래스로 정의합니다.

    그리고 ActionEvent 제네릭을 통해서 ActionEvent라는 타입으로 handle 을 구현해야 합니다.

     

    이 부분에 대해서 람다식을 안쓴 이유는 익숙해지기 위해서다...

    나중에 점차 익숙해지면 람다식으로만 쓰기로 해야겠다.

     

    그래서 getText().equals라는 메서드로 만약에 "hello" 문자열이 text와 맞으면 setText로 Accept로 바꿔준다.

    이런식으로 버튼의 문자열이 바뀌는 이벤트 처리이다.

    버튼을 클릭했을 때 지정해야하는 ActionEvent -> setOnActionEvent메서드로 구현.

     

    	Button btn2 = new Button("Accept");
    		DropShadow shadow=new DropShadow();
    		
    		btn2.setOnMouseEntered(new EventHandler<MouseEvent>() {
    			public void handle(MouseEvent e) {
    				btn2.setEffect(shadow);
    			}
    		});
    		
    		btn2.setOnMouseExited(e->btn2.setEffect(null));
    		HBox.setMargin(btn2,new Insets(10));

    그리고 다음으로 설명할 메서드.

    Button2를 생성했고 setText(인자) 로는 Accept를 넣어주었다.

    여기서는 뭘 바꾸고 할게 아니라 이벤트처리를 통해서 그림자를 새길건데

    DropShadow라는 객체를 만들어서 setEffect라는 메서드로 구현을 하면 된다.

     

    아까랑 같이 람다식을 쓰지 않고 eventhandler 익명이너클래스를 구현해서 handle 메서드를 재정의 할거다.

     

    마우스커서가 버튼에 올라가야 이벤트가 나오니까  이건 MouseEvent가 맞을 것 같다.

    setOnMouseEntered 라는 메서드로 구현해서 setEffect(shodow객체)이런식로 하면

    마우스커서가 버튼에 올라갔을때(Entered) shadow를 나타낸다.

     

    그리고 마우스가 내려갔을 때 setEffect에 null값을 인자로 주게 되면 효과가 없어진다.

     

    Image imgOK=new Image(this.getClass()
    				.getResourceAsStream("Check_16x16.png"));
    		//getClass로 언어와 getResoure
    		Image imgDel=new Image(this.getClass()
    				.getResourceAsStream("Delete_16x16.png"));
    		Button btn3= new Button("Accept",new ImageView(imgOK));
    		//Button("setText()",imageview object);
    		btn3.setOnAction(event->{
    			if (btn3.getText().equals("Hello")){
    				btn3.setText("Aceept");
    				btn3.setGraphic(new ImageView(imgOK));
    			}
    			else {
    				btn3.setText("Hello");
    				btn3.setGraphic(new ImageView(imgDel));
    			}
    		});
    		
    		//FileInputStream inputstream = new FileInputStream("img.jpg");
    		//Image img = new Image(inputstream);
    		//ImageView imgView = new ImageView(img);
    		//이런식으로 생성을 하는 방법도 있다.
    		//이미지는 자체로 이미지를 띄우는 기능이 없기 때문에
    		//이비지 view객체를 만들어야 띄울 수 있다.
    		//상기 방법도 맞는 방법이다.
    		

    다른 건 다 똑같은데 주석처리 한 곳에 보면 image를 불러오는 방법은 다양하다.

    편한 방법으로 쓰면 된다고 교수님께서 말씀하셨는데... 성질엔 다 알아야 할 것 같은 성질이다... 피곤한 스타일...

     

    그리고 여기서 기억할거 setGraphics<< 아이콘을 바꾸는메서드니까 이미지 view를 올리게 되면 아이콘이 바뀐다.

     

    끝이다.

    다음은 시간 되면 람다식 까지 정리해야겠다.

    이미 알아도 한번 더 정리하는게 좋은거니까.

    'Programming > JAVA' 카테고리의 다른 글

    [JAVA FX] 간단한 계산기 만들기  (0) 2020.11.26
    JAVA.LANG PACKAGE  (0) 2020.07.07
    inner class  (0) 2020.06.28
    abstract include interface(2)  (0) 2020.06.28
    abstract include interface  (0) 2020.06.27
Designed by Tistory.