【问题标题】:Display image chosen from Jfilechooser on Jpanel在 Jpanel 上显示从 Jfilechooser 中选择的图像
【发布时间】:2020-08-19 21:10:28
【问题描述】:

我正在尝试制作一个 JPanel,它有一个按钮,您可以单击该按钮来上传图像。当您单击打开时,它会弹出一个带有 JFilechooser 的对话框,该对话框将文件路径名存储在 ArrayList 中。我希望选择的图像在选择后出现在 JPanel 上。我知道很多人以前都问过这个问题,但我已经尝试了所有我能找到的解决方案,但我无法让图像出现。这是我单击上传按钮时执行的操作的代码(AddImages 是 Jpanel):

private void pic1ActionPerformed(java.awt.event.ActionEvent evt) {                                     
        JFileChooser fc = new JFileChooser();
        int result = fc.showOpenDialog(null);
        if (result == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            String sname = file.getAbsolutePath();
            ImageIcon icon = new ImageIcon(sname);
            JLabel label = new JLabel(icon, JLabel.CENTER);
            AddImages.add(label);
        }
    }                                    

当我尝试上传图像时,图像被存储在 ArrayList 中(通过添加一行在我添加图像后打印 ArrayList 的大小进行测试),但它没有显示在 JPanel 上。有谁知道我做错了什么?提前致谢。

编辑:这是面板的完整代码(可见)。对 pic1 和 pic2 执行的操作是相同的代码,我在上面已经展示过:

addImagePrompt.setText("添加一些图片");

    pic2.setText("add pic");
    pic2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            pic2ActionPerformed(evt);
        }
    });

    pic1.setText("add pic");
    pic1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            pic1ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout AddImagesLayout = new javax.swing.GroupLayout(AddImages);
    AddImages.setLayout(AddImagesLayout);
    AddImagesLayout.setHorizontalGroup(
        AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(AddImagesLayout.createSequentialGroup()
            .addGap(50, 50, 50)
            .addGroup(AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(AddImagesLayout.createSequentialGroup()
                    .addComponent(pic2)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(pic2name, javax.swing.GroupLayout.PREFERRED_SIZE, 376, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addComponent(pic1)
                .addComponent(addImagePrompt))
            .addContainerGap(161, Short.MAX_VALUE))
    );
    AddImagesLayout.setVerticalGroup(
        AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(AddImagesLayout.createSequentialGroup()
            .addGap(22, 22, 22)
            .addComponent(addImagePrompt)
            .addGap(18, 18, 18)
            .addComponent(pic1)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(AddImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(pic2)
                .addComponent(pic2name))
            .addContainerGap(377, Short.MAX_VALUE))
    );

    mainPanel.add(AddImages, "card16");

【问题讨论】:

    标签: java swing netbeans


    【解决方案1】:

    将组件添加到容器后,您必须调用revalidate(),以便其布局管理器(重新)计算子组件的位置并重新绘制它们:

    JLabel label = new JLabel(icon, JLabel.CENTER);
    AddImages.add(label);
    AddImages.revalidate();
    

    如果您使用同一个“AddImages”面板上传多张图片,您会看到它们都作为单独的组件添加到面板中。如果这不是您所期望的,您需要重新考虑如何处理此问题。

    【讨论】:

    • 谢谢。我试过了,但它仍然无法正常工作。我也试过 AddImages.revalidate(); AddImages.repaint();但什么也没发生
    • 我们需要查看更多您的代码 - “AddImages”面板甚至在屏幕上可见吗?你能创建一个minimal reproducible example 来重现你的问题吗?
    • 我刚刚更新了我的原始帖子以包含我的代码
    • 该代码不是最小,我也不能运行它来重现问题。但无论如何,您的面板似乎使用了GroupLayout 的复杂配置。您创建的新标签应该放在布局中的什么位置?它是否可能被放置在框架中可见的区域之外?
    • @bld,是的,问题是 GroupLayout。它希望您在将组件添加到面板时使用各种约束来控制组件的位置。您不能只使用没有约束的 add(...) 方法并期望它能够工作。不要使用 IDE 来生成代码。然后,您可以完全控制布局管理器,并且可以更轻松地创建动态 GUI。另外,请注意变量名不应以大写字符开头。
    【解决方案2】:

    您在这里唯一缺少的是适当的布局管理器。 你可以在这里阅读:A Visual Guide to Layout Managers

    因此,例如添加这样的内容应该可以帮助您实现您想要的:

    AddImages.setLayout(new BoxLayout(AddImages, BoxLayout.Y_AXIS));
    AddImages.add(label);
    AddImages.revalidate();
    this.pack();
    

    【讨论】:

      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 2013-06-17
      • 2016-10-09
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多