JavaFX 在网格窗格中显示多个图像
Posted
技术标签:
【中文标题】JavaFX 在网格窗格中显示多个图像【英文标题】:JavaFX displaying multiple images in grid pane 【发布时间】:2018-03-03 12:29:36 【问题描述】:我正在尝试制作一个简单的程序,在网格窗格中显示 4 张图像。我在那里没有问题,但是一旦我尝试添加第二个,我就会遇到一些问题。这是我的代码:
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);
我认为图像后面的行和列可能有问题,但我尝试了一些方法并没有成功。任何帮助是极大的赞赏。谢谢
【问题讨论】:
抱歉,遇到问题我的意思是根本不会显示第二张图片。我添加了一个屏幕截图。 hmmm 我认为这可能是标志本身的图像。我注意到中国国旗是透明的;可能与此有关。 使用两个美国国旗,你的代码就可以工作了。 【参考方案1】:flakes 有点对,但不是图像本身,而是它的可用性。如果我在浏览器中打开中国国旗的url,一切正常,但是试试修改后的代码:
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);
...我在 TextField 中得到的是:
服务器返回 HTTP 响应代码:403 对应 URL:http://bestanimations.com/Flags/Asia/china/chinese-flag-waving-gif-animation-10.gif
HTTP 403 - 禁止访问
这似乎是罪魁祸首。
【讨论】:
我猜这与网站试图阻止网络抓取有关? 啊酷!按照示例here,您可以通过覆盖http 代理来绕过它!System.setProperty("http.agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/28.0.1500.29 Safari/537.36");
没错,你的速度更快! ;-) 我只是想指出,如果您手头有一个正在运行的 tomcat(或任何其他 Web 服务器),您可以尝试从浏览器和 javafx 调用一些 URL,并查看请求的确切差异。【参考方案2】:
代码没有问题。问题出在第二张 gif 图像上。例如,如果您下载它并从项目资源中加载它,它将正确加载。现在为什么你不能“访问”来自 url 的 gif 是另一回事。我会检查它,如果我找到一些东西,我会编辑这个答案。
编辑:
如果您使用上述代码加载图像,请进行一些调试:
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);
你会看到第二个 gif 会给你一个错误 java.io.IOException with Server 返回 HTTP 响应代码:403 for URL ...
所以我猜服务器不会通过 http 请求“授予”对 gif 图像的访问权限,这就是您无法加载它的原因。当涉及到 Https 请求时,我不是“专业人士”,所以我可能错了。
403 Forbidden with Java but not web browser?
通过上面的帖子,您可以稍微修改一下代码并加载它:
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);
我赶不上@flakes @tomorrow :P
【讨论】:
以上是关于JavaFX 在网格窗格中显示多个图像的主要内容,如果未能解决你的问题,请参考以下文章