ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • javaFX - view 컨트롤 (ImageView, ListView, TableView)
    고급 JAVA/FX 2020. 5. 22. 19:36

    ImageView 컨트롤

     

     - 이미지를 보여주는 컨트롤

     

    FXML에서 선언
    
    <ImageView fitWidth="폭" fitHeight="높이" preserveRatio="true" />
    
    preserveRatio : 이미지의 가로세로 비율을 유지할지 여부 지정.
    
    false 이면 : fitWidth와 fitHeight 크기에 이미지가 맞춰진다.
    
    true 이면 : ImageView의 크기가 조절된다.
    
    
    
    이미지 보여주는 방법
    
    1.
    
    <ImageView preserveRatio="true" />
    
       <Image url="@images/abc.jpg" />
    
    </ImageView>
    
    
    
    2.
    
    <ImageView fitWidth="250" fitHeight="175" preserveRatio="true" />
    
       <image>
    
           <Image url="@images/abc.jpg" />
    
      </image>
    
    </ImageView>
    
    
    
    <Image url="@images/abc.jpg" /> 의 url의 속성은 FXML 파일 위치에서 상대경로로
    
     "@이미지경로"를 지정해주면 됨.

     

    ListVIew 컨트롤

     

     - 항목들을 목록으로 보여주는 컨트롤

     

    ListView에 항목을 추가할 때는 : setItems(ObservableList<T> value) 메서드를 사용.

     

    ObservableList 구현 객체는 FXCollections.observableArrayList(E... items) 정적 메서드를 생성하면 됨

     

    => listview.setItems(FXCollections.observableList("swing", "JavaFX"));

     

    중요

     

    getSelectionModel() 메서드로 MultipleSelectionModel 을 얻고 , selectedIndexProperty or

     

    selectedItemProperty에 리스너를 설정하면 됩니다. 

     

    selectedIndexProperty : 선택된 인덱스.

     

    selectedItemProperty : 선택된 항목.

     

     

    TableView 컨트롤

    <TableView prefHeight="100" prefWidth="250">
    
        <columns>
    
            <TableColumn prefWidth="175" text="텍스트1"/>
    
            <TableColumn prefWidth="175" text="텍스트2"/>
    
        </columns>
    
    </TableView>

    *TableView에 행을 추가하려면 행의 데이터를 가지고 있는 model 객체가 필요합니다.

     

    model의 속성 타입은 컬럼 값의 데이터 타입에 따라 

     

    javafx.beans.property패키지의 SimpleXXXProperty 를 사용하면 됩니다.

     

    package thisisjava;
    
    
    
    import javafx.beans.property.SimpleStringProperty;
    
    
    
    public class Phone {
    
    private SimpleStringProperty smartPhone;
    
    private SimpleStringProperty image;
    
    
    public Phone() {
    
    this.smartPhone = new SimpleStringProperty();
    
    this.image = new SimpleStringProperty();
    
    }
    
    public Phone(String smartPhone, String image) {
    
    this.smartPhone = new SimpleStringProperty(smartPhone);
    
    this.image = new SimpleStringProperty(image);
    
    }
    
    
    public String getSmartPhone() {
    
    return smartPhone.get();
    
    }
    
    public void setSmartPhone(String smartPhone) {
    
    this.smartPhone.set(smartPhone);;
    
    }
    
    public String getImage() {
    
    return image.get();
    
    }
    
    public void setImage(String image) {
    
    this.image.set(image);
    
    }
    
     
    
    }

     

    위처럼 모델 클래스를 작성한 후 모델 속성과 TableColumn을 연결하는 코드를 작성해야 함.

     

    TableColumn은 TableView의 getColumns.get(인덱스)로 얻어내고, 첫 번째 인덱스는 0이다.

     

    TableColumn의 setCellValueFactory() 메서드는 매개값으로 제공되는 PropertyValueFactory("모델속성명")을 이용해서

     

    모델 속성 값을 TableColumn값으로 세팅.

     

     

    ex)
    
    TableColumn tcSmartPhone = tableView.getColumns().get(0);
    
    tcSmartPhone.setCellValueFactory( new PropertyValueFactory("smartPhone") );

     

    셀(Cell) 내에서 정렬이 필요할 때에는 TableColumn의 setStyle() 메서드로 CSS를 적용하면 된다.

    tcSmartPhone.setStyle("0fx-alignment: CENTER;");  

     

    행의 데이터를 주기위해 ObservableList에 모델 객체들을 저장하고 ObservableList를 매개값으로 해서 TableView의 setItems()메서드를 호출하여 행들을 추가.

    ObservableList phoneList = FXCollections.observableArrayList(

     

           new Phone("스마트폰1", "phone1.jpg"),

     

           new Phone("스마트폰2", "phone2.jpg"),

     

           new Phone("스마트폰3", "phone3.jpg")

    );

     

    tableView.setItems(phoneList);

     

    예제

     

    예제)
    
    FXML
    
    <?xml version="1.0" encoding="UTF-8"?>
    
    
    
    <?import javafx.scene.text.*?>
    
    <?import javafx.scene.shape.*?>
    
    <?import javafx.scene.web.*?>
    
    <?import javafx.geometry.*?>
    
    <?import javafx.scene.image.*?>
    
    <?import java.lang.*?>
    
    <?import javafx.scene.control.*?>
    
    <?import javafx.scene.layout.*?>
    
    <?import javafx.collections.*?>
    
    
    
    <AnchorPane xmlns:fx="http://javafx.com/fxml" fx:controller="thisisjava.RootController"
    
    prefHeight="180.0" prefWidth="500.0" >
    
       <children>
    
          <Label layoutX="11.0" layoutY="9.0" text="리스트뷰" />
    
          <ListView fx:id="listView" layoutX="10.0" layoutY="30.0" prefHeight="100.0" prefWidth="100.0" />
    
          <Label layoutX="125.0" layoutY="9.0" text="테이블뷰" />
    
          <TableView fx:id="tableView" layoutX="120.0" layoutY="30.0" prefHeight="100.0" prefWidth="290.0">
    
            <columns>
    
              <TableColumn prefWidth="100.0" text="스마트폰" />
    
              <TableColumn prefWidth="100.0" text="이미지" />
    
            </columns>
    
          </TableView>
    
          <Label layoutX="425.0" layoutY="9.0" text="이미지뷰" />
    
          <ImageView fx:id="imageView" fitHeight="100.0" fitWidth="60.0" layoutX="430.0" layoutY="30.0" preserveRatio="true" />
    
          <Button layoutX="190.0" layoutY="145.0" onAction="#handleBtnOkAction" text="확인" />
    
          <Button layoutX="260.0" layoutY="145.0" onAction="#handleBtnCancelAction" text="취소" />
    
       </children>
    
     
    
    </AnchorPane>
    
    
    
    
    
    자바1)
    
    package thisisjava;
    
    
    
    import javafx.beans.property.SimpleStringProperty;
    
    
    
    public class Phone {
    
    private SimpleStringProperty smartPhone;
    
    private SimpleStringProperty image;
    
    
    public Phone() {
    
    this.smartPhone = new SimpleStringProperty();
    
    this.image = new SimpleStringProperty();
    
    }
    
    public Phone(String smartPhone, String image) {
    
    this.smartPhone = new SimpleStringProperty(smartPhone);
    
    this.image = new SimpleStringProperty(image);
    
    }
    
    
    public String getSmartPhone() {
    
    return smartPhone.get();
    
    }
    
    public void setSmartPhone(String smartPhone) {
    
    this.smartPhone.set(smartPhone);;
    
    }
    
    public String getImage() {
    
    return image.get();
    
    }
    
    public void setImage(String image) {
    
    this.image.set(image);;
    
    }
    
     
    
    }
    
    
    자바2)
    
    package thisisjava;
    
    
    
    import java.net.URL;
    
    import java.util.ResourceBundle;
    
    
    
    import javafx.application.Platform;
    
    import javafx.beans.value.ChangeListener;
    
    import javafx.beans.value.ObservableValue;
    
    import javafx.collections.FXCollections;
    
    import javafx.collections.ObservableList;
    
    import javafx.event.ActionEvent;
    
    import javafx.fxml.FXML;
    
    import javafx.fxml.Initializable;
    
    import javafx.scene.control.ListView;
    
    import javafx.scene.control.TableColumn;
    
    import javafx.scene.control.TableView;
    
    import javafx.scene.control.cell.PropertyValueFactory;
    
    import javafx.scene.image.Image;
    
    import javafx.scene.image.ImageView;
    
    
    
    public class RootController implements Initializable {
    
    @FXML private ListView<String> listView;
    
    @FXML private TableView<Phone> tableView;
    
    @FXML private ImageView imageView;
    
    
    @Override
    
    public void initialize(URL location, ResourceBundle resources) {
    
    listView.setItems(FXCollections.observableArrayList(
    
    "스마트폰1", "스마트폰2", "스마트폰3", "스마트폰4", "스마트폰5", "스마트폰6", "스마트폰7"
    
    ));
    
    listView.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
    
    @Override
    
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
    
    tableView.getSelectionModel().select(newValue.intValue());
    
    tableView.scrollTo(newValue.intValue());
    
    }
    
    });
    
    
    ObservableList phoneList = FXCollections.observableArrayList(
    
        new Phone("갤럭시S1", "phone01.png"),
    
        new Phone("갤럭시S2", "phone02.png"),
    
        new Phone("갤럭시S3", "phone03.png"),
    
        new Phone("갤럭시S4", "phone04.png"),
    
        new Phone("갤럭시S5", "phone05.png"),
    
        new Phone("갤럭시S6", "phone06.png"),
    
        new Phone("갤럭시S7", "phone07.png")
    
    );
    
    
    TableColumn tcSmartPhone = tableView.getColumns().get(0);
    
    tcSmartPhone.setCellValueFactory(
    
    new PropertyValueFactory("smartPhone")
    
    );
    
    tcSmartPhone.setStyle("-fx-alignment: CENTER;");
    
    
    TableColumn tcImage = tableView.getColumns().get(1);
    
    tcImage.setCellValueFactory(
    
    new PropertyValueFactory("image")
    
        );
    
    tcImage.setStyle("-fx-alignment: CENTER;");
    
    
    tableView.setItems(phoneList);
    
    
    tableView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Phone>() {
    
    @Override
    
    public void changed(ObservableValue<? extends Phone> observable, Phone oldValue, Phone newValue) {
    
    if(newValue!=null) {
    
    imageView.setImage(new Image(getClass().getResource("images/" + newValue.getImage()).toString()));
    
    }
    
    }
    
    });
    
    }
    
    
    public void handleBtnOkAction(ActionEvent e) {
    
    String item = listView.getSelectionModel().getSelectedItem();
    
    System.out.println("ListView 스마트폰: " + item);
    
    
    Phone phone = tableView.getSelectionModel().getSelectedItem();
    
    System.out.println("TableView 스마트폰: " + phone.getSmartPhone());
    
    System.out.println("TableView 이미지: " + phone.getImage());
    
    }
    
    
    public void handleBtnCancelAction(ActionEvent e) {
    
    Platform.exit();
    
    }
    
     
    
    }
    
    
    
    
    
    
    자바3)
    
    package thisisjava;
    
    
    
    import javafx.application.Application;
    
    import javafx.fxml.FXMLLoader;
    
    import javafx.scene.Parent;
    
    import javafx.scene.Scene;
    
    import javafx.stage.Stage;
    
    
    
    public class AppMain extends Application {
    
    @Override
    
    public void start(Stage primaryStage) throws Exception {
    
    Parent root = (Parent)FXMLLoader.load(getClass().getResource("root.fxml"));
    
    Scene scene = new Scene(root);
    
    
    primaryStage.setTitle("뷰 컨트롤 예제");
    
    primaryStage.setScene(scene);
    
    primaryStage.show();
    
    }
    
    
    public static void main(String[] args) {
    
    launch(args);
    
    }
    
     
    
    }
    
    

    '고급 JAVA > FX' 카테고리의 다른 글

    javaFX - CSS (inline 스타일)  (0) 2020.05.23
    JavaFX - 차트 컨트롤  (0) 2020.05.23
    javaFX - 입력 컨트롤  (0) 2020.05.22
    javaFX 컨트롤 - 버튼 컨트롤  (0) 2020.05.22
    javaFX 속성 바인딩  (0) 2020.05.22

    댓글

Designed by Tistory.