Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: JavaFX a Scene builder - jak vložit a měnit obrázek v prvku

Aktivity
Avatar
relycanx
Člen
Avatar
relycanx:10.4.2014 23:29

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
Tvůrce
Avatar
Odpovídá na relycanx
Hartrik:11.4.2014 14:33

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:11.4.2014 17:57

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
Tvůrce
Avatar
Odpovídá na relycanx
Hartrik:11.4.2014 18:12

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:11.4.2014 18:56

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
Tvůrce
Avatar
Odpovídá na relycanx
Hartrik:11.4.2014 22:06

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:11.4.2014 23:00

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
Tvůrce
Avatar
Odpovídá na relycanx
Hartrik:12.4.2014 13:16

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
12.4.2014 13:16
Avatar
relycanx
Člen
Avatar
Odpovídá na Hartrik
relycanx:12.4.2014 14:50

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

 
Nahoru Odpovědět
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.