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 在网格窗格中显示多个图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在javafx中用鼠标绘制选定的网格窗格范围

javafx 2网格窗格行在使用percentHeight时重叠

如何在 JavaFX 中交换两个 GridPane 节点?

JavaFX:将图像插入 GridPane

JavaFX 标签高度

为啥Altium design 10新建PCB文件后为啥图像没网格啊怎么让他有网格显示啊