2017-09-22 1 views
4

enter image description here Ich versuche, ein einfaches Programm zu machen, das 4 Bilder in einem Rasterbereich anzeigt. Ich bekomme eins drin, kein Problem, aber sobald ich versuche, eine Sekunde hinzuzufügen, habe ich Probleme. Hier ist mein Code:JavaFX zeigt mehrere Bilder im Raster an

package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 

     GridPane gridPane = new GridPane(); 

     gridPane.add(new ImageView(new Image ("http://gifimage.net/wp-content/uploads/2017/06/american-flag-gif-13.gif")), 1,1); 
     gridPane.add(new ImageView(new Image ("http://bestanimations.com/Flags/Asia/china/chinese-flag-waving-gif-animation-10.gif")), 2,2); 

     Scene scene = new Scene(gridPane, 1000, 500); 
     primaryStage.setTitle("Flags"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 


    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 

Ich denke, es könnte ein Problem mit der Zeile und Spalte nach dem Bild sein, aber ich habe ein paar Dinge ausprobiert und nicht erfolgreich gewesen. Jede Hilfe wird sehr geschätzt. Danke

+0

Tut mir leid, durch Probleme zu laufen, ich meine, wird das zweite Bild überhaupt nicht angezeigt. Ich habe einen Screenshot hinzugefügt. –

+0

hmmm Ich denke, es könnte das Bild der Flagge selbst sein. Ich merke, dass die chinesische Flagge Transparenz hat; könnte etwas damit zu tun haben. – flakes

+0

Mit zwei amerikanischen Flaggen funktioniert Ihr Code. – flakes

Antwort

0

Es ist nichts falsch mit dem Code. Das Problem liegt auf dem zweiten gif-Bild. Wenn Sie es zum Beispiel herunterladen und es aus den Projektressourcen laden, wird es korrekt geladen. Nun, warum Sie nicht auf das Gif von URL zugreifen können, ist eine andere Sache .. Ich werde es überprüfen und wenn ich etwas finde, werde ich diese Antwort bearbeiten.

Edit:

Doing einige Debuggen, wenn Sie den obigen Code verwenden, um die Bilder zu laden:

gridPane.add(new ImageView(new Image(new URL("http://gifimage.net/wp-content/uploads/2017/06/american-flag-gif-13.gif").openStream())), 0, 
       0); 
gridPane.add(new ImageView(new Image(new URL("http://bestanimations.com/Flags/Asia/china/chinese-flag-waving-gif-animation-10.gif").openStream())),0, 1); 

Sie werden sehen, dass die zweite gif geben Ihnen einen Fehler java.io.IOException mit Der Server hat den HTTP-Antwortcode zurückgegeben: 403 für URL ...

Also ich denke, der Server gibt keinen Zugriff auf das Gif-Bild durch HTTP-Anfragen, deshalb kann man ihn nicht laden. Ich bin kein Profi, wenn es um HTTP-Anfrage geht, also könnte ich mich irren.

403 Forbidden with Java but not web browser?

Mit dem obigen Beitrag, den Sie es ändern können Ihren Code ein wenig, und laden Sie finden:

URL url = new URL("http://bestanimations.com/Flags/Asia/china/chinese-flag-waving-gif-animation-10.gif"); 
URLConnection conn = url.openConnection(); 
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 

conn.connect(); 

GridPane gridPane = new GridPane(); 

gridPane.add(new ImageView(new Image(new URL("http://gifimage.net/wp-content/uploads/2017/06/american-flag-gif-13.gif").openStream())), 0,0); 
gridPane.add(new ImageView(new Image(conn.getInputStream())), 0, 1); 

ich nicht mit @flakes @tomorrow aufholen können: P

2

Flocken ist irgendwie richtig, aber es ist nicht das Bild selbst, es ist seine Verfügbarkeit. Wenn ich die URL der chinesischen Flagge im Browser zu öffnen, ist alles in Ordnung, aber versuchen Sie den geänderten Code:

package sample; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.TextField; 
import javafx.stage.Stage; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.VBox; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     Image imgUsa = new Image ("http://gifimage.net/wp-content/uploads/2017/06/american-flag-gif-13.gif"); 
     Image imgChina = new Image ("http://bestanimations.com/Flags/Asia/china/chinese-flag-waving-gif-animation-10.gif"); 

     ImageView ivUsa = new ImageView(imgUsa); 
     ImageView ivChina = new ImageView(imgChina); 


     TextField errorText = new TextField(); 
     if (imgChina.isError()) { 
      errorText.setText(imgChina.getException().getMessage()); 
     } 

     VBox root = new VBox(ivUsa, ivChina, errorText); 

     Scene scene = new Scene(root, 1000, 500); 
     primaryStage.setTitle("Flags"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 


    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 

... was ich in der TextField- bekommen ist:

Server HTTP-Antwortcode zurückgegeben : 403 URL: http://bestanimations.com/Flags/Asia/china/chinese-flag-waving-gif-animation-10.gif

HTTP 403 - Zugang verboten

Und das scheint der Täter zu sein.

+0

Ich vermute, das hat damit zu tun, dass die Website versucht, das Crawlen im Web zu verhindern? – flakes

+2

Ahh cool! Nach dem Beispiel [hier] (https://stackoverflow.com/a/16826459/3280538) können Sie umgehen, indem Sie den http-Agenten überschreiben! 'System.setProperty (" http.agent "," Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/28.0.1500.29 Safari/537.36 ");' – flakes

+1

Genau, Sie waren schneller!;-) Ich wollte nur bemerken, dass Sie, wenn Sie einen laufenden Tomcat (oder einen anderen Webserver) zur Hand haben, versuchen könnten, eine URL vom Browser und von javafx aufzurufen und den genauen Unterschied in den Anfragen zu sehen. – tomorrow