2016-08-19 15 views
2

이 질문을하기 전에 어디에서나 솔루션을 찾았습니다. 이미 존재하는 경우이를보고하십시오.JavaFX, 탭 사이에 매개 변수 전달

CLICK TO VIEW THE IMAGE

TabLayout.fxml

<JFXTabPane fx:id="tabbedPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefWidth="500.0" tabClosingPolicy="UNAVAILABLE" tabMinWidth="100.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.TAB.TabController" stylesheets="@tab.css"> 
<tabs> 
    <Tab id="anagrafeTab" closable="false" text="Anagrafe"> 
    <content> 
     <fx:include fx:id="anagrafeL" source="/application/Anagrafe/AnagrafeLayout.fxml"/> 
    </content> 
    </Tab> 
    <Tab id="visiteTab" closable="false" text="Visite"> 
    <content> 
     <fx:include fx:id="visiteL" source="/application/Visite/VisiteLayout.fxml"/> 
    </content></Tab> 
    <Tab id="latteTab" closable="false" text="Produzione Latte"> 
    <content> 
     <fx:include fx:id="latteL" source="/application/Latte/LatteLayout.fxml"/> 
    </content> 
    </Tab> 
    <Tab id="partiTab" closable="false" text="Parti" > 
    <content> 
     <fx:include fx:id="partiL" source="/application/Parti/PartiLayout.fxml"/> 
    </content> 
    </Tab> 
</tabs> 
</JFXTabPane> 

"포함"모든위한 레이아웃 :

  • AnagrafeLayout.fxml
  • 실제로

    나는이 상황이 나는 모델과 모든 레이아웃에 대한 컨트롤러하지만 고유 발신자가보다

  • PartiLayout.fxml

  • LatteLayout.fxml
  • VisiteLayout.fxml
  • 6,.

    public class Tab { 
    
    public Tab() { 
        inizializza(); 
    } 
    
    private void inizializza() { 
        try { 
         Stage stage = new Stage(); 
         stage.setTitle("Dati"); 
         stage.getIcons().add(new Image(getClass().getResourceAsStream("insert.png"))); 
    
         FXMLLoader loader = new FXMLLoader(); 
         loader.setLocation(getClass().getResource("TabLayout.fxml")); 
         JFXTabPane root = (JFXTabPane) loader.load(); 
    
         Scene scene = new Scene(root,660,430); 
         stage.setScene(scene); 
    
         stage.show(); 
         //ScenicView.show(scene); 
    
        } catch(Exception e) { 
         e.printStackTrace(); 
        } 
    
        } 
    } 
    

    각 컨트롤러에 ObservableList<Visite> data = FXCollections.observableArrayList();을 전달해야합니다.

    나는 어떻게해야하는지 잘 모르며, 꽤 긴 클래스이기 때문에 단일 컨트롤러를 사용하지 않을 것입니다.

    편집 :

    TABController.java

    public class TabController implements Initializable { 
    
    @FXML 
    private TabPane tabbedPane; 
    
    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
        assert tabbedPane != null : "fx:tabbedPane=\"in\" was not injected: check your FXML file 'TabLayout.fxml'."; 
    
        tabbedPane.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> { 
    
         if(tabbedPane.getSelectionModel().getSelectedIndex() != 0) { 
          tabbedPane.getScene().getWindow().setWidth(1171); 
          tabbedPane.getScene().getWindow().setHeight(700); 
         } else { 
          tabbedPane.getScene().getWindow().sizeToScene(); 
         }   
        }); 
        } 
    } 
    

    EDIT2

    4 개 탭, 위의 각 자신의 모델 클래스를 언급 한 바와 같이, 있습니다. 그래서 각 탭마다 테이블이 있으므로 동적으로 채워지기 때문에 처음에는 비어있는 4 개의 다른 목록이 있습니다. 다른 인턴쉽에서 tabPane을 호출하면 목록이 생성됩니다. 이전 목록이로드 될 가능성이 있으므로이 목록이 필요하므로이 정보를 컨트롤러에 전달해야합니다.

    는 실제로이 상황이 발생합니다

    1)

    전화 탭에있는 테이블에서로드 빈 목록을 생성하는 기능을 삽입. 그런 다음 데이터가 닫힐 때 데이터베이스에 저장됩니다.

    2)

    전화 목록을 작성하고 데이터베이스에서 데이터를 소요하고 수정할 수있는 테이블로 전송 특정 플래그 기능 삽입을 호출하는 기능이 표시됩니다.

    나는 질문의 모호함이 지금은이 방법

    public class TabController implements Initializable { 
    
    @FXML 
    private TabPane tabbedPane; 
    
    @FXML 
    private VisiteController visiteLController; 
    private ObservableList<Visite> dataVisite = FXCollections.observableArrayList(); 
    private ObservableList<Visite> dataDelVisite = FXCollections.observableArrayList(); 
    
    @FXML 
    private LatteController latteLController; 
    private ObservableList<Latte> dataLatte = FXCollections.observableArrayList(); 
    private ObservableList<Latte> dataDelLatte = FXCollections.observableArrayList(); 
    
    @FXML 
    private PartiController partiLController; 
    private ObservableList<Parti> dataParti = FXCollections.observableArrayList(); 
    private ObservableList<Parti> dataDelParti = FXCollections.observableArrayList(); 
    
    
    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
        assert tabbedPane != null : "fx:tabbedPane=\"in\" was not injected: check your FXML file 'TabLayout.fxml'."; 
    
        tabbedPane.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> { 
    
         if(tabbedPane.getSelectionModel().getSelectedIndex() != 0) { 
          tabbedPane.getScene().getWindow().setWidth(1171); 
          tabbedPane.getScene().getWindow().setHeight(700); 
         } else { 
          tabbedPane.getScene().getWindow().sizeToScene(); 
         }   
        });  
    
        visiteLController.setData(dataVisite, dataDelVisite); 
        latteLController.setData(dataLatte, dataDelLatte); 
        partiLController.setData(dataParti, dataDelParti); 
    } 
    } 
    

    및 설정 방법에 분명히 각 컨트롤러

    에 대해 변경 해결하고있어

    앞에 내가 사과, 나는 분명했다 희망

    public void setData(ObservableList<Visite> data, ObservableList<Visite> dataDel) { 
        this.data = data; 
        this.dataDel = dataDel; 
        liveSearh(); 
    } 
    
    +1

    'TabController'에 대한 코드를 게시 할 수 있습니까? 이것은 http://stackoverflow.com/questions/37068243/share-model-with-nested-controller –

    +0

    의 복제본처럼 보입니다. 이제 링크를 돌아 보겠습니다. –

    +0

    질문을 명확히하십시오. 각각의 컨트롤러는 정확히 무엇을 필요로합니까? 그리고 각각의 필요 데이터를 어디서 만들거나 데이터에 액세스 할 수 있습니까? –

    답변

    0

    로 컨트롤러를 만들 때 컨트롤러에 전달할 수 있도록 controller factory을 사용하는 것이 가장 좋습니다.. 예를 들어

    public class TabController implements Initializable { 
    
        private final ObservableList<Visite> data ; 
    
        public TabController(ObservableList<Visite> data) { 
         this.data = data ; 
        } 
    
        // existing code... 
    } 
    

    하고,

    public class AnagrafeController implements Initializable { 
    
        private final ObservableList<Visite> data ; 
    
        public AnagrafeController(ObservableList<Visite> data) { 
         this.data = data ; 
        } 
    
        // existing code... 
    } 
    

    지금 당신은 본질적으로 컨트롤러 공장을, 필요 : 그들은 생성자 관찰 목록을 복용 그래서

    그래서 첫째, 모든 컨트롤러를 정의 Class을 취하여 해당 클래스의 컨트롤러를 반환하는 함수.

    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("TabLayout.fxml")); 
    
    ObservableList<Visite> data = FXCollections.observableArrayList(); 
    
    loader.setControllerFactory((Class<?> controllerType) -> { 
        try { 
         Constructor<?>[] constructors = controllerType.getConstructors(); 
         for (Constructor<?>[] constructor : constructors) { 
          if (constructor.getParameterCount() == 1 && 
           constructor.getParameterTypes()[0] == ObservableList.class) 
    
           return constructor.newInstance(data); 
          } 
         } 
    
         // no suitable constructor found, just use default: 
         return controllerType.newInstance(); 
    
        } catch (Exception exc) { 
         System.out.println("Could not create controller:"); 
         exc.printStackTrace(); 
         return null ; 
        } 
    }); 
    
    JFXTabPane root = loader.load(); 
    
    // ... 
    

    이가 관찰 목록 (data)와 컨트롤러 클래스는 매개 변수로 관찰 목록을 복용 생성자가있는 경우, data가로 전달되어 있는지 확인합니다 컨트롤러 공장을 만들 것입니다 : 이것은 단지 약간의 반사를 필요 그 매개 변수.

    <fx:include>을 사용하면 동일한 컨트롤러 팩토리가 포함 된 FXML 파일의 컨트롤러를 만드는 데 사용되므로 적절한 생성자를 정의한다고 가정 할 때 동일한 목록이 해당 컨트롤러에도 전달됩니다.

    기본적으로 컨트롤러에 개체 주입을 자동화하는 종속성 주입 프레임 워크를 고려할 수도 있습니다. Afterburner.fx은 매우 훌륭한 JavaFX 종속성 주입 프레임 워크입니다.

    +0

    글쎄, 탭 컨트롤러는 데이터 목록을 필요로하지 않지만 각 컨트롤에 대해 다른 목록을 제공해야합니다. 각 컨트롤러 클래스에 대한 팩토리 컨트롤러를 만들어야합니까? 그리고 하나 대신 두 개의 목록을 보내는 경우? 귀하의 답변을 기다리는 동안, 귀하는 저에게 보낸 링크에있는 솔루션에 자신을 맞추 었습니다. 즉 TabController 클래스에서 여러 컨트롤러 클래스의 컨트롤러를 선언하고 다른 컨트롤러 클래스에있는 setter를 호출합니다. –

    +1

    좋아, 나는 다른 컨트롤러간에 데이터를 공유해야한다는 것이 문제라고 생각했습니다. 'TabController'에있는리스트에 접근 할 수 있다면, 다른 컨트롤러들 각각에서'setData (...)'메소드를 정의하고'TabController'의'initialize()' 방법? –

    +0

    내 초기 솔루션은 실수로 작동하지 않는다 : 나는 컨트롤러 변수의 이름을 제대로 선언하지 않았다. 처음에 나에게 보낸 링크 덕분에 눈치 챘습니다. :) –