2017-02-09 2 views
0

В настоящее время я делаю программу, я хочу, чтобы нажимали кнопку, и она запускает другой класс, и в зависимости от результата этого класса я хочу, чтобы изображение было видно на той же сцене, что и кнопка, которая была нажата для изменения. У меня все закодировано до такой степени, что выход изменяет изображение. Как я могу это сделать?(JavaFX) Как я могу изменить изображение в ImageView, закодированном в файле fxml с базовым классом java?

Java Class

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> 

контроллер

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 class, fxml и fxml – Tresk33

+0

Если вам нужно больше из класса Java, дайте мне знать – Tresk33

ответ

1

FXML Сначала сделайте параметризированный метод 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() метод из класса контроллера 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, Можете ли вы проверить fxml 'USPImage' ImageView перед установкой 'LeadConduitUSPS (USPImage)'? Он может быть нулевым. – GltknBtn