Avatar
relycanx
Člen
Avatar
relycanx:

Ahoj, chtěl bych se zeptat, jak by se v JavaFX dal dát obrázek do nějakého prvku a pak ho za běhu programu, např. klikáním myši na něj měnil. Zobrazit se dá přes prvek Image view, ale změnit se mi ho už za běhu programu už nepovedlo. Zkoušel jsem třeba vyvolat na instanci fci ,,setImage()", ale ani se to nehlo a že jsem s tím experimentoval fakt asi 3 a půl hoďky v kuse. Jako v klasické JavaFX, bez použití propojení s FXML to zvládnu, ale tady vůbec nevím, jak na to mám vytvořit funkci a nikde na netu jsem úplně typický příklad nenašel. Jako dokážu měnit obrázky třeba v tlačítkách, ale samostatně to je fakt maso. Budu vděčný za každou pomoc :)

 
Odpovědět 10.4.2014 23:29
Avatar
Hartrik
Redaktor
Avatar
Odpovídá na relycanx
Hartrik:

Mělo by to být jak popisuješ, jen jsi možná metodu setImage() používal mimo JavaFX application thread. Zkus jí nastavit takto:

Platform.runLater(new Runnable() {
    @Override public void run() {
        imageView.setImage(...);
    }
});

Také můžeš použít WritableImage (http://download.java.net/…leImage.html) a dále měnit jen ten obrázek.

Editováno 11.4.2014 14:34
 
Nahoru Odpovědět 11.4.2014 14:33
Avatar
relycanx
Člen
Avatar
Odpovídá na Hartrik
relycanx:

Aha, no.. a to můžu vložit normálně do toho controleru? Já to tam totiž měl takhle, aby se ve Scene builderu dala jen ta metoda přiřadit ke komponentě Image Viewu, stejně jako se třeba u labelu měnil podobným způsobem text.

@FXML
private void handleButtonAction(MouseEvent event) {
   Image img = new Image("2.png");
   obrazekImageView.setImage(img);
}
Editováno 11.4.2014 17:58
 
Nahoru Odpovědět 11.4.2014 17:57
Avatar
Hartrik
Redaktor
Avatar
Odpovídá na relycanx
Hartrik:

Takhle by to mělo fungovat...
Zkus ještě jinak napsat cestu k souboru

/cz/xx/yy/2.png
 
Nahoru Odpovědět 11.4.2014 18:12
Avatar
relycanx
Člen
Avatar
Odpovídá na Hartrik
relycanx:

zkusil jsem napsat název toho souboru se zavináčem na začátku, potom taky nakopčil jen na disk, aby se dala takto jednoduše napsat cesta ,,Image img = new Image("C:\2.png");" a stejně nic, sakryš :/ :D furt jen error asi na 100 řádků :D

Editováno 11.4.2014 18:57
 
Nahoru Odpovědět 11.4.2014 18:56
Avatar
Hartrik
Redaktor
Avatar
Odpovídá na relycanx
Hartrik:

Nic dalšího mě nenapadá, musel bych vidět zdroják.

 
Nahoru Odpovědět 11.4.2014 22:06
Avatar
relycanx
Člen
Avatar
Odpovídá na Hartrik
relycanx:

Tak tady je můj controller. je to jediná věc, ve které jsem se hrabal, když nepočítám umístění elementu do scene builderu a přiřazení id + metody

package fxtest;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;

public class SampleController implements Initializable {

    @FXML
    private ImageView obrazekImageView;

    @FXML
    private void handleButtonAction(MouseEvent event) {
       Image img = new Image("C:\2.png");
        obrazekImageView.setImage(img);
    }

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

}
 
Nahoru Odpovědět 11.4.2014 23:00
Avatar
Hartrik
Redaktor
Avatar
Odpovídá na relycanx
Hartrik:

Problém je v tom načítání obrázků.
Správně je to třeba takto:

@FXML private ImageView imageView;

private static final String[] images = {
    "01.png", "02.jpg", "03.png", "04.png"
};

@FXML
private void handleButtonAction(ActionEvent event) {
    String name = images[new Random().nextInt(images.length)];
    InputStream resourceAsStream = this.getClass().getResourceAsStream(name);

    imageView.setImage(new Image(resourceAsStream));
}

Pokud jsou všechny obrázky ve stejném balíčku jako kontroler.

Celý projekt: https://db.tt/2Y1603it

 
Nahoru Odpovědět  +1 12.4.2014 13:16
Avatar
relycanx
Člen
Avatar
Odpovídá na Hartrik
relycanx:

Uááááááá! funguje tooo! :D dík moc :)

 
Nahoru Odpovědět  +1 12.4.2014 14:50
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.