java - 尝试覆盖/替换 JPanel

标签 java swing jpanel

为了显示一系列图像,我在 Activity 监听器方法中创建一个全新的 JPanel,然后将该面板发送到另一个方法以添加图像。这非常有效,除非我再次点击“搜索”并需要一组全新的图像。我得到了新面板,但旧面板存在于其下方,因此它们只是堆叠在一起,而不是用新面板替换旧面板。

我尝试在 Activity 监听器最开始的位置分配一个空白面板,但这似乎不起作用。 panel.removeAll() 不起作用,因为我每次都创建一个新的 imagesPanel 。有没有人有什么建议?谢谢!

searchButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String searchString = searchText.getText();

            if (searchDropList.getSelectedItem().equals(character)) {


                ArrayList<Character> characterDetails = wikiDB.searchCharacter(searchString);

                if (characterDetails.size() == 0) {

                    //Do other stuff
                } else {

                    editCharacterButton.setVisible(true);

                    for (int i = 0; i < characterDetails.size(); i++) {
                        characterID = characterDetails.get(i).getCharacterID();

                    }

                    ArrayList<String> characterImages = wikiDB.searchImages(characterID);

                    JPanel imagesPanel = displayImages(characterImages, c);


                    c.fill = GridBagConstraints.HORIZONTAL;
                    c.gridx = 0;
                    c.gridy = 6;

                    rootPanel.add(imagesPanel, c);
                    rootPanel.repaint();

                    setContentPane(rootPanel);
                    pack();
                    setVisible(true);
                    System.out.println("Repainting.");

                }
            }
        }
    });

private JPanel displayImages(ArrayList<String> characterImages, GridBagConstraints c){
    BufferedImage img1 = null;
    JPanel imagesPanel = new JPanel();
    imagesPanel.setLayout(new GridBagLayout());

    for (int x = 0; x < characterImages.size(); x++) {

        String imageURL = characterImages.get(x);

        try {
            URL url1 = new URL(imageURL);

            URLConnection conn1 = url1.openConnection();
            conn1.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");
            InputStream in1 = conn1.getInputStream();

            img1 = ImageIO.read(in1);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }


        if (img1 != null) {

            //target size is no bigger than 100 x 100
            int w;
            int h;
            if (img1.getWidth() > img1.getHeight()) {
                //if the source was wider than it was tall, make the width 100,
                w = 100;
                //and scale the height accordingly
                h = (int) ((double) img1.getHeight() / img1.getWidth() * 100.0);
            } else {
                //otherwise, vice versa (and if w == h, then they are both 100)
                h = 100;
                int myH = img1.getHeight();
                int myW = img1.getWidth();
                w = (int) ((double) img1.getWidth() / img1.getHeight() * 100.0);

                w= w*3;
                h = h*3;
            }

            BufferedImage img2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2 = img2.createGraphics();
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2.drawImage(img1, 0, 0, w, h, null);
            g2.dispose();

            c.fill = GridBagConstraints.HORIZONTAL;
            c.gridx = x%4;
            c.gridy = x/4;

            Border b1 = new BevelBorder(
                    BevelBorder.LOWERED, Color.LIGHT_GRAY, Color.DARK_GRAY);
            Border b2 = new LineBorder(Color.GRAY, 12);
            Border bTemp = new CompoundBorder(b1,b2);


            JLabel cIcon = new JLabel(new ImageIcon(img2));

            cIcon.setBorder(bTemp);
            imagesPanel.add(cIcon, c);

        }
    }

    return imagesPanel;

}

最佳答案

仅创建一个面板并使用 CardLayout CardLayout tutorial

它就像一副纸牌。您可以按名称添加卡片、显示最后一张卡片以及删除卡片(如果涉及许多图像)。

欲了解更多信息,请查看此处:Cardlayout doc

关于java - 尝试覆盖/替换 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30174681/

相关文章:

java - 如何使用 JPanel 将一系列线函数合并为一个 drawPolygon 函数?

java - 从 Xuggler 中的帧获取视频

java - 使用 swing 代码获得意外的输出

java - 如何在 Swing 应用程序的对话框中提供 JavaFX 组件?

java - JTable 不改变外观

java - 用图像替换 JTextField?

java - opengl java 加载 png 纹理无法正常工作

java更新 HashMap

java - 如何检查 JIT 编译器是否在 Java 中关闭

java - 我可以向 JPanel 添加 ActionListener