当前位置: 首页 > 知识库问答 >
问题:

显示来自JComboBox事件的JFrame中的图像

娄利
2023-03-14

我想实现以下功能:

例如:

  • 当用户从JComboBox中选择“Profile Pic”项时,“Profile Pic”文件夹中的相关图像应加载在同一帧中
  • 同样,当用户选择“产品Img”项目时,应加载“产品Img”文件夹中的相关图像,以替换以前的图像

以下是代码片段,请建议任何更改

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;

public class NewClass1 {

    public static void main(String[] args) {
        createAndShowJFrame();
    }

    public static void createAndShowJFrame() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                JFrame frame = createJFrame();
                frame.setVisible(true);

            }
        });
    }

    private static JFrame createJFrame() {
        JFrame frame = new JFrame();
        //frame.setResizable(false);//make it un-resizeable
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Test");

        ArrayList<BufferedImage> images = null;

        try {
            images = getImagesArrayList();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        final ImageViewPanel imageViewPanel = new ImageViewPanel(images);
        JScrollPane jsp = new JScrollPane(imageViewPanel);
        jsp.setPreferredSize(new Dimension(400, 400));
        frame.add(jsp);

       final  javax.swing.JComboBox filter = new javax.swing.JComboBox<>();
        filter.addItem("All");
        filter.addItem("Profile Pic");
        filter.addItem("Company Logo");
        filter.addItem("Product Img");


        JPanel controlPanel = new JPanel();
        JButton addLabelButton = new JButton("Delete Selected Image");
        addLabelButton.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                imageViewPanel.removeFocusedImageLabel();
            }
        });
        JLabel label =new JLabel("Filter By :");
        filter.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {

                String cat=(String) filter.getSelectedItem();

               createJFrame(cat);
            }
        });
        controlPanel.add(addLabelButton);
        controlPanel.add(label);
        controlPanel.add(filter);
        frame.add(controlPanel, BorderLayout.NORTH);
        frame.pack();



        return frame;
    }

    private static ArrayList<BufferedImage> getImagesArrayList(String cat) throws Exception {
        System.out.println(cat);

        ArrayList<BufferedImage> images = new ArrayList<>();
        if(cat.equals("Profile Pic"))
        images.add(resize(ImageIO.read(new URL("http://192.168.1.25:8080/pic/ProfilePic/1.jpg")), 100, 100));
        else if(cat.equals("Product Img"))
        {
        images.add(resize(ImageIO.read(new URL("http://192.168.1.25:8080/pic/ProductImg/2.jpg")), 100, 100));

        }
        return images;
    }

private static ArrayList<BufferedImage> getImagesArrayList() throws Exception {
       ArrayList<BufferedImage> images = new ArrayList<>();
       images.add(resize(ImageIO.read(new URL("http://localhost:8080/pic/All/a.jpg")), 100, 100));
       images.add(resize(ImageIO.read(new URL("http://localhost:8080/pic/All/b.jpg")), 100, 100));
           return images;
   }
    public static BufferedImage resize(BufferedImage image, int width, int height) {
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TRANSLUCENT);
        Graphics2D g2d = (Graphics2D) bi.createGraphics();
        g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
        g2d.drawImage(image, 0, 0, width, height, null);
        g2d.dispose();
        return bi;
    }
}

共有1个答案

万高轩
2023-03-14

我敦促您再看看我发布的代码(您似乎正在使用)从JFrame删除图像。

然而:

在您的代码中,我看到:

  filter.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {

                String cat=(String) filter.getSelectedItem();

                createJFrame(cat);
            }
        });

我甚至找不到方法createJFrame(String cat);?

在我看来,你应该这样做:

filter.addActionListener(new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {

        String cat=(String) filter.getSelectedItem();

        ArrayList<BufferedImage> images=getImagesArrayList(cat);//get the new images for the selected item in combo

        //refresh the layout by removing old pics and itertating the new array and adding pics to the panel as you iterate
        layoutLabels(images);
    }

});

  ....

 private JLabel NO_IMAGES=new JLabel("No Images");

 private void layoutLabels(ArrayList<BufferedImage> images) {
        removeAll();//remove all components from our panel (the panel should only have the images on if not use setActionCommand("Image") on your images/JLabels and than use getComponents of JPanel and iterate through them looking for getActionCommand.equals("Image")

        if (images.isEmpty()) {//if the list is empty
            add(NO_IMAGES);//add Jlabel to show message of no images
        } else {
            remove(NO_IMAGES);
            for (BufferedImage i : images) {//iterate through ArrayList of images
                add(new JLabel(new ImageIcon(i)));//add each to the panel using JLabel as container for image
            }
        }

        revalidate();
        repaint();
    }
 类似资料:
  • 我有一个包含动态内容的JFrame和 只有当用户按下JButton时才显示框架,my_frame类只包含一个构造函数(用于第一次调用)和一个用于刷新其内容的刷新方法。现在我希望当JFrame再次变得可见时,my_frame拦截事件并自动调用refresh方法。我该怎么做?

  • 问题内容: 嗨,我的数据库中有一个图像表。这些与细节一起存储为Blob,例如图像类型和名称。 我在显示图像时遇到问题,我得到的只是一个带有红色十字的白框。码: 谢谢 问题答案: 好吧,这是一个简短的答案。 检查您的Blob类型是否至少为MEDIUMBLOB,它能够存储高达16M的数据

  • 在尝试了“php artisan存储:链接”等解决方案后,图像仍然无法在前端(vuejs)中显示。 图像本身存储在“storage/public/app/xxx.png”中 vuejs中的代码是。 我试图通过浏览器访问图像”http://127.0.0.1:80/api/storage/xxx.png,但导致“未找到” 任何线索都将不胜感激。

  • 问题内容: 我有点卡住。为什么不做这项工作?我只是收到一条错误消息: java.lang.NoSuchMethodError:主要 线程“主”中的异常 问题答案: main需要是静态的,并且必须具有String []而不是String的参数。 为了解决这个问题,将所有东西都放在构造函数中,例如

  • 问题内容: 我试图在不显示JFrame本身的情况下将JFrame渲染到图像。我试过使用这段代码: 然而,当这仅适用的设置。这将导致图像显示在屏幕上,这不是我想要的。我也尝试创建类似这样的东西: 但是,这将显示黑色图像(如上面的代码)。我很确定我所追求的是可能的,问题是我真的找不到如何做。我在使用自定义Swing组件方面的经验非常有限,因此任何信息都会受到赞赏。 谢谢。 问题答案: 这是应该解决问题

  • 因此,我有一段html,其中包括一个mat表单字段,该字段有一个mat select和一个mat选项。这些mat选项是从服务器生成的,它们有一个图像,当选择一个选项时,我需要在mat select中显示该图像(每个选项都有自己的图像) 每次选择新选项时,我都要在mat select中显示选项标签和图像。 我读过mat select触发器,但对我来说没有任何效果。