试图覆盖/替换JPanels

时间:2015-05-11 18:09:21

标签: java swing jpanel

为了显示一系列图像,我在我的主动侦听器方法中创建一个全新的JPanel,然后将该面板发送到另一个方法来添加图像。这很有效,除非我再次点击“搜索”并需要一组全新的图像。我得到了新的面板,但旧的面板存在于其下面,因此代替New Panel取代Old Panel,它们只是堆叠。

我尝试在活动侦听器的最开头为该位置分配一个空白面板,但这似乎不起作用。 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;

}

1 个答案:

答案 0 :(得分:2)

只创建一个Panel并使用CardLayout CardLayout tutorial

就像一副纸牌。您可以按名称添加卡片,显示最后一张卡片并删除卡片,如果它将是许多图像。

有关详细信息,请点击此处:Cardlayout doc