2016-12-04 9 views
-1

Просто для предисловия, я искал несколько часов, пытаясь найти решение этого здесь и нескольких других сайтов. Если вы найдете вопрос, который я, возможно, пропустил, сообщите мне.java swing - рисование нескольких jpanels на одной и той же jframe

Anywho, я пытаюсь создать средство просмотра миниатюр, которое отображает 4 эскизов (в jpanels) и 4 подписи. Я могу вытащить все 4 миниатюры, но они все одинаковы (дубликаты последнего окрашены). Я думаю, что это часть того, как я пытаюсь перерисовать их, но я не могу понять, что изменить. ImageAlbum - это ArrayList путей jpg.

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 

EDIT

класс 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 

FINAL EDIT

Я, очевидно, не унд очень хорошо, поэтому я решил использовать другой подход: вместо этого я использую JLabels и делаю значки. Отлично работает, спасибо всем за вашу помощь

+1

1) Для лучшей помощи в ближайшее время отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). Чтобы быть MCVE, этот код должен был бы: a) включить 'main (String [])' метод b) сократить количество изображений с 4 до двух c) Извлечь отсутствующий код, например 'ImageAlbum'. 2) Один из способов получить изображение (ы) для MCVE - это горячая ссылка на изображения, видимые в [этом Q & A] (http://stackoverflow.com/q/19209650/418556). 3) См. [Я должен избегать использования методов Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (Да.) –

+0

Возможный дубликат [* добавить древки для весеннего макета, как сетка? *] (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 i настройка панели в gridlayout с панелью.setLayout (новая gridLayou (...))? –

+0

Я изменил этот бит кода, но он все еще показывает все 4 миниатюры как дубликаты. 'contentPane.setBorder (новый Пустая граница (5, 5, 5, 5)); ' и ' contentPane.add (панель, новый FlowLayout (FlowLayout.CENTER)); ' –

+1

нормально, возможно, это не неправильно, как я подумал. Вот почему люди досадно настаивают на простых примерах; здесь очень много кода, мне не стоит понимать все это, когда вы можете не хотеть ответа, когда я, наконец, найду его, найду ответ самостоятельно, возможно, оставил что-то, что мне нужно, и т. д. и т. д. В качестве учебного упражнения я предлагаю вам написать свой простой пример; JUST JFrame, с макетом границы и сеткой в ​​центре, с некоторыми ярлыками или изображениями или что угодно. Не следует принимать более 100 строк. Если вы не видите свою собственную ошибку, то кто-то здесь может. – arcy