在jpanel上显示从jfilechooser选择的图像

tct7dpnv  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(331)

我正在尝试制作一个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");
wlsrxk51

wlsrxk511#

这里唯一缺少的就是一个合适的布局管理器。您可以在这里阅读:布局管理器的视觉指南
例如,添加这样的内容可以帮助您实现您的愿望:

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

lztngnrs2#

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

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

如果使用同一个“addimages”面板上载多个图像,您将看到它们都作为单独的组件添加到面板中。如果这不是你所期望的,你需要重新思考你如何处理这个问题。

相关问题