2016-12-04 67 views
-1

只是为了序言,我已经找了几个小时试图在这里和其他几个网站上找到解决方案。如果您发现我可能错过的问题,请告诉我。java swing - 在同一个jframe上绘制多个jpanels

Anywho,我试图创建一个缩略图查看器,显示4个缩略图(在jpanels中)和4个字幕。我可以画出所有4个缩略图,但它们都是相同的图像(最后一幅画的重复图)。我认为这是我试图重新绘制它们的一部分,但我无法弄清楚要改变什么。 imageAlbum是一个jpg路径的ArrayList。

enter image description here

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 

//import MainFrame.ImageComponent; 

import javax.swing.JLabel; 

public class Thumbnails extends JFrame { 
    final int IMG_WIDTH = 80; 
    final int IMG_HEIGHT = 60; 
    private BufferedImage image; 
    private ImageAlbum imageAlbum; 
    private JPanel contentPane; 
    private JPanel thmbnl_1; 
    private JPanel thmbnl_2; 
    private JPanel thmbnl_3; 
    private JPanel thmbnl_4; 
    private JLabel thmbnl_1Label; 
    private JLabel thmbnl_2Label; 
    private JLabel thmbnl_3Label; 
    private JLabel thmbnl_4Label; 

    /** 
    * Create the frame. 
    */ 
    public Thumbnails(ImageAlbum album) { 
     imageAlbum = album; 
     String captionUnavailable = "Caption is not available"; 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JPanel panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.CENTER); 
     panel.setLayout(new GridLayout(4, 2, 0, 0)); 

     thmbnl_1 = new JPanel(); 
     thmbnl_1.setPreferredSize(new Dimension(80, 60)); 
     panel.add(thmbnl_1); 

     thmbnl_2 = new JPanel(); 
     thmbnl_2.setPreferredSize(new Dimension(80, 60)); 
     panel.add(thmbnl_2); 

     thmbnl_1Label = new JLabel(captionUnavailable); 
     panel.add(thmbnl_1Label); 

     thmbnl_2Label = new JLabel(captionUnavailable); 
     panel.add(thmbnl_2Label); 

     thmbnl_3 = new JPanel(); 
     thmbnl_3.setPreferredSize(new Dimension(IMG_WIDTH, IMG_HEIGHT)); 
     panel.add(thmbnl_3); 

     thmbnl_4 = new JPanel(); 
     thmbnl_4.setPreferredSize(new Dimension(IMG_WIDTH, IMG_HEIGHT)); 
     panel.add(thmbnl_4); 

     thmbnl_3Label = new JLabel(captionUnavailable); 
     panel.add(thmbnl_3Label); 

     thmbnl_4Label = new JLabel(captionUnavailable); 
     panel.add(thmbnl_4Label); 

     setupThumbnails(); 
    }// end Thumbnails(ImageAlbum album) 


    // 
    private void setupThumbnails() { 
     int albumSize = imageAlbum.getSize(); 

     for(int i = 0; i < albumSize; i++) { 
      try {   
       image = resizeToThumbnail(ImageIO.read(new File(imageAlbum.getAlbum(i)))); 

       switch(i) { 
        case 0: 
         thmbnl_1.setLayout(new BorderLayout()); 
         thmbnl_1.add(new ImageComponent(image), BorderLayout.CENTER); 
         thmbnl_1Label.setText(imageAlbum.getCaption(i)); 
         break; 
        case 1: 
         thmbnl_2.setLayout(new BorderLayout()); 
         thmbnl_2.add(new ImageComponent(image), BorderLayout.CENTER); 
         thmbnl_2Label.setText(imageAlbum.getCaption(i)); 
         break; 
        case 2: 
         thmbnl_3.setLayout(new BorderLayout()); 
         thmbnl_3.add(new ImageComponent(image), BorderLayout.CENTER); 
         thmbnl_3Label.setText(imageAlbum.getCaption(i)); 
         break; 
        case 3: 
         thmbnl_4.setLayout(new BorderLayout()); 
         thmbnl_4.add(new ImageComponent(image), BorderLayout.CENTER); 
         thmbnl_4Label.setText(imageAlbum.getCaption(i)); 
         break; 
        default: 
         break; 
       }// end switch-case 

       revalidate(); 
       repaint();    
      }// end try-block 
      catch(IOException e) { 
       e.printStackTrace(); 
      }// end catch-block 
     }// end for-loop 
    }// end setupCaptions() 


    // 
    public BufferedImage resizeToThumbnail(BufferedImage original) { 
     int type; 
     BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, original.getType()); 
     Graphics2D g = resizedImage.createGraphics(); 
     g.drawImage(original, 0, 0, IMG_WIDTH, IMG_HEIGHT, null); 
     g.dispose(); 
     g.setComposite(AlphaComposite.Src); 
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
     g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY); 
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 

     return resizedImage; 
    }// end resizeToThumbnail(...) 


    class ImageComponent extends JComponent { 
     /** 
     * Desc: constructor for ImageComponent 
     * @param: BufferedImage img 
     * @return: nothing 
     */ 
     public ImageComponent(BufferedImage img) { 
      image = img; 
     }// end ImageComponent() 


     /** 
     * Desc: draws out the image to the panel 
     * @param: Graphics g 
     * @return: void 
     */ 
     @Override 
     public void paintComponent(Graphics g) { 
      if(image == null) 
       return; 

      Graphics2D g2d = (Graphics2D) g; 

      // draw the image 
      g.drawImage(image, 0, 0, this); 
      g.dispose(); 
     }// end paintComponents(Graphics g) 
    }// end class ImageComponent 
}// end class class Thumbnails 

编辑

ImageAlbum类:

import java.util.*; 


public class ImageAlbum { 
    private ArrayList imageAlbum; 
    private ArrayList imageCaptions; 
    private int size; 


    /** 
    * Desc: getter for album size 
    * @param: none 
    * @return: int 
    */ 
    public int getSize() { 
     return size; 
    }// end getSize() 


    /** 
    * Desc: getter for the image 
    * @param: int index 
    * @return: String 
    */ 
    public String getAlbum(int index) { 
     return imageAlbum.get(index).toString(); 
    }// end getAlbum(int index) 



    /** 
    * Desc: getter for the image caption 
    * @param: int index 
    * @return: String 
    */ 
    public String getCaption(int index) { 
     return imageCaptions.get(index).toString(); 
    }// end getCaption(int index) 


    /** 
    * Desc: default constructor for ImageAlbum 
    * @param: none 
    * @return: nothing 
    */ 
    public ImageAlbum() { 
     imageAlbum = new ArrayList(); 
     imageCaptions = new ArrayList(); 
     size = 0; 
    }// end ImageAlbum() 


    /** 
    * Desc: parameterized constructor for ImageAlbum 
    * @param: none 
    * @return: nothing 
    */ 
    public ImageAlbum(ArrayList tempImageAlbum, ArrayList tempImageCaptions) { 
     imageAlbum = tempImageAlbum; 
     imageCaptions = tempImageCaptions; 
    }// end ImageAlbum(...) 


    /** 
    * Desc: adds the image directory and caption to both array lists 
    * @param: String imageDirectory, String imageCaption 
    * @return: void 
    */ 
    public void add(String imageDirectory, String imageCaption) { 
     imageAlbum.add(imageDirectory); 
     imageCaptions.add(imageCaption); 
     size++; 
    }// end add(...) 


    /** 
    * Desc: clears imageAlbum and imageCaptions array lists 
    * @param: nothing 
    * @return: void 
    */ 
    public void clear() { 
     imageAlbum.clear(); 
     imageCaptions.clear(); 
     size = 0; 
    }// end clear() 
}// end class ImageAlbum 

最后编辑

我显然不是UND非常好,所以我决定采取不同的方法 - 我使用JLabels并代替图标。非常好,谢谢大家的帮助

+1

1)为了更快地获得更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。要成为一个MCVE,这段代码需要a)包含一个'main(String [])'方法b)将图像的数量从4个减少到2个c)分解像'ImageAlbum'这样的缺失代码。 2)获取MCVE图像的一种方法是热链接到[本问答](http://stackoverflow.com/q/19209650/418556)中看到的图像。 3)请参阅[我是否应避免使用Java Swing中的set(Preferred | Maximum | Minimum)Size方法?](http://stackoverflow.com/q/7229226/418556)(是) –

+0

[*]添加thumnails春天布局像网格?*](http://stackoverflow.com/q/15961412/230513)。 – trashgod

+0

我已经添加了ImageAlbum类 - 不知道如何将图像从4减少到2将有所帮助,虽然 –

回答

0

您的panel设置为BorderLayout,并且您为每个缩略图调用panel.add()。该方法将给定的组件设置到BorderLayout的中间,取代所有组件,所以这就是为什么你只看到最后一个添加。 BorderLayout不会做你想要的缩略图。

我希望你想要GridLayout;它列出添加到它的行和列的组件。将你的panel设置为GridLayout(或其他任何你想要布局缩略图),并添加缩略图。然后把panel放在任何你想要的地方;默认情况下,JFrame上有一个Borderlayout,你可能想把panel放在中间。

+0

Arent我设置面板gridlayout与panel.setLayout(新gridLayou(...))? –

+0

我已经更改了那一点代码,但它仍然显示所有4个缩略图为重复。 'contentPane。setBorder(new EmptyBorder(5,5,5,5));' 和 'contentPane.add(panel,new FlowLayout(FlowLayout.CENTER));' –

+1

好吧,也许这并不是错误的方式认为这是。这就是为什么人们烦恼地坚持简单的例子;这里有太多的代码,当我最终找到答案时可能不需要答案,可能自己找到答案,可能留下了我需要的东西等等,等等,这些都是不值得我理解的。作为一种学习练习,我建议你自己写一个简单的例子;只是一个JFrame,带有边界布局,网格布局在它的中心,带有一些标签或图像等等。不应该超过100行。如果你看不到自己的错误,那么这里有人可以。 – arcy