2017-02-09 31 views
0

我目前正在製作一個程序,我想要一個按鈕被點擊並運行另一個類,並且根據該類的輸出,我想要在與單擊的按鈕相同的場景中更改圖像視圖。我已經編碼到輸出更改圖像的位置。我怎麼能這樣做呢?(JavaFX)如何更改ImageView中的圖片,這些圖片是用基本Java類編碼在fxml文件中的?

的Java類

public static void USPSCase() { 
     printUSPS(); 
    } 

    public static void printUSPS(){ 
     Random rand = new Random(); 
     int gunSelect = rand.nextInt(99)+1; 

     if(gunSelect<=30){ //Calculates which gun you will get 
      LeadConduitUSPS(CaseSpinners.USPSCaseSpinController.setUSPImage); 
     } 
     else if(gunSelect>=31 && gunSelect<=60){ 
      NightOpsUSPS(); 
     } 
     else if(gunSelect>=61 && gunSelect<=90){ 
      TorqueUSPS(); 
     } 
     else if(gunSelect>=91 && gunSelect<=93.5){ 
      GuardianUSPS(); 
     } 
     else if(gunSelect>=94.5 && gunSelect<=97){ 
      CyrexUSPS(); 
     } 
     else if(gunSelect>=98 && gunSelect<=99){ 
      CaimanUSPS(); 
     } 
     else if(gunSelect==100){ 
      KillConfirmedUSPS(); 
     } 


    } 

//some code... these two methods are connected 
        public static void LeadConduitUSPS(ImageView setUSPImage){ 
     System.out.println("Lead Conduit"); 

     Random rand = new Random(); 
     int wareSelect = rand.nextInt(99)+1; 

if(wareSelect<=10){ //Calculates the ware the gun has 
      setUSPImage.setImage(new Image("csgocaseopener/icon.png")); 
     } 
     else if(wareSelect>=11 && wareSelect<=25){ 
      setUSPImage.setImage(new Image("csgocaseopener/icon.png")); 
     } 
     else if(wareSelect>=26 && wareSelect<=60){ 
      setUSPImage.setImage(new Image("csgocaseopener/icon.png")); 
     } 
     else if(wareSelect>=61 && wareSelect<=80){ 
      setUSPImage.setImage(new Image("csgocaseopener/icon.png")); 
     } 
     else if(wareSelect>=81){ 
      setUSPImage.setImage(new Image("csgocaseopener/icon.png")); 
     } 
    } 

FXML文件

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.image.Image?> 
<?import javafx.scene.image.ImageView?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.text.Font?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="CaseSpinners.USPSCaseSpinController"> 
    <children> 
     <ImageView fitHeight="400.0" fitWidth="600.0" pickOnBounds="true"> 
     <image> 
      <Image url="@../csgocaseopener/back.png" /> 
     </image> 
     </ImageView> 
     <ImageView fx:id="spinmechback" fitHeight="45.0" fitWidth="45.0" onMouseClicked="#handleSpinMechBack" pickOnBounds="true" preserveRatio="true" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="-1.0"> 
     <image> 
      <Image url="@../csgocaseopener/backbtn.png" /> 
     </image> 
     </ImageView> 
     <Button fx:id="SpinUSPS" layoutX="235.0" layoutY="301.0" mnemonicParsing="false" onAction="#SpinUSPSCase" text="SPIN"> 
     <font> 
      <Font name="System Bold" size="36.0" /> 
     </font> 
     </Button> 
     <ImageView fx:id="setAWPImage" fitHeight="200.0" fitWidth="200.0" layoutX="201.0" layoutY="100.0" pickOnBounds="true" preserveRatio="true"> 
     <image> 
      <Image url="@../csgocaseopener/bprof.png" /> 
     </image></ImageView> 
    </children> 
</AnchorPane> 

FXML控制器

public class USPSCaseSpinController implements Initializable { 

     @FXML 
     public static ImageView setUSPImage; 

     @FXML 
     private void handleSpinMechBack(MouseEvent event) throws IOException{ 
     Parent handleInventoryBackParent = FXMLLoader.load(getClass().getResource("/csgocaseopener/OpenCase.fxml")); 
     Scene OPBackScene = new Scene(handleInventoryBackParent); 
     Stage handleInventoryBackStage = (Stage) ((Node) event.getSource()).getScene().getWindow(); 
     handleInventoryBackStage.setScene(OPBackScene); 
     handleInventoryBackStage.show(); 
     } 

     @FXML 
     private void SpinUSPSCase(ActionEvent event) throws IOException{ 
      test test = new test(); 
      test.LeadConduitUSPS(setUSPImage); 
     } 
     @FXML 
     public void SetUSPImage(){ 
      setUSPImage.setImage(new Image("AWPCase.png")); 
     } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    } 
} 
+0

你能分享你的樣品代碼嗎? – GltknBtn

+0

剛剛添加了java類,fxml和fxml控制器 – Tresk33

+0

如果您需要更多的Java類,請告知我 – Tresk33

回答

1

首先要在你的支持者類LeadConduitUSPS()參數化方法。與此類似,

public static void LeadConduitUSPS(ImageView image){ 
    System.out.println("Lead Conduit"); 

    Random rand = new Random(); 
    int wareSelect = ((int)(rand.nextDouble() * 99)) +1; 

    if(wareSelect<=10){ //Calculates the ware the gun has 
     System.out.println("Factory New"); 
    } 
    else if(wareSelect>=11 && wareSelect<=25){ 
     //Changes Image here!! 
     image.setImage(new Image("new_image1.png"); 
    } 
    else if(wareSelect>=26 && wareSelect<=60){ 
     //Changes Image here!! 
     image.setImage(new Image("new_image2.png"); 
    } 
    else if(wareSelect>=61 && wareSelect<=80){ 
     //Changes Image here!! 
     image.setImage(new Image("new_image3.png"); 
    } 
    else if(wareSelect>=81){ 
     //Changes Image here!! 
     image.setImage(new Image("new_image4.png"); 
    } 
} 

然後調用從LeadConduitUSPS()方法Controller類的SpinUSPSCase()

public class USPSCaseSpinController implements Initializable { 

    @FXML 
    private ImageView setUSPImage; 

    @FXML 
    private void handleSpinMechBack(MouseEvent event) throws IOException{ 
    Parent handleInventoryBackParent = FXMLLoader.load(getClass().getResource("/csgocaseopener/OpenCase.fxml")); 
    Scene OPBackScene = new Scene(handleInventoryBackParent); 
    Stage handleInventoryBackStage = (Stage) ((Node) event.getSource()).getScene().getWindow(); 
    handleInventoryBackStage.setScene(OPBackScene); 
    handleInventoryBackStage.show(); 
    } 

    @FXML 
    private void SpinUSPSCase(ActionEvent event) throws IOException{ 

     //call from here 
     YourAnotherClass test = new YourAnotherClass(); 
     test.LeadConduitUSPS(USPImage); 
    } 

    @FXML 
    public void SetUSPImage(){ 
     setUSPImage.setImage(new Image("AWPCase.png")); 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

    } 
} 
+0

哦,是的,謝謝!這很有道理,我明天會試一試,看看我會如何去,如果我還有其他問題,我會檢查。 – Tresk33

+1

@tyler reski,祝你好運! –

+1

再次嗨!這個程序現在只是完美的工作,我只是想知道是否有任何方法可以將多個參數傳遞給LeadConduit方法?它在測試類的不同部分被調用,並且它輸出一個錯誤,因爲它可以通過調用帶有圖像視圖參數的方法來傳遞它。 – Tresk33

0

您可以通過ImageView的實例(USPImage)從FXML提供給您的LeadConduitUSPS(ImageView imgView)方法。然後,您可以在您的相關課程中將圖像設置爲此imgView。希望它是有用的。

+0

一切似乎都與這段代碼很好地工作,但我似乎得到一個NullPointerException到代碼的末尾,有什麼想法,爲什麼? – Tresk33

+0

你能分享錯誤日誌嗎? – GltknBtn

+0

@ Tresk33,您可以在設置'LeadConduitUSPS(USPImage)'之前檢查fxml'USPImage'ImageView嗎?它可能爲空。 – GltknBtn