2016-12-04 116 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