2017-03-14 1 views
0

JComponent関数をギャラリーとして作成しようとしています。 JScrollPaneに存在するコンポーネントに表示される予定の保存されたイメージを表示できなければなりません。また、画像を削除する機能を追加する予定です。私はそのコンポーネントにイメージを表示することができました。私はこれにどのようにアプローチすべきですか?Swing JScrollPaneギャラリーの実装

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.File; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollBar; 
import javax.swing.JScrollPane; 

public class GalleryPanel extends JPanel 
{ 

private static final long serialVersionUID = 1L; 
private int currentImage; 
private JLabel[] images; 
private final int MAX_IMAGES = 12; 
private JScrollPane scrollPane; 
private JPanel imageGallery; 

public void init() 
{ 
    setLayout(new BorderLayout()); 
    images = new JLabel[MAX_IMAGES]; 
    imageGallery = new JPanel(); 
    imageGallery.setLayout(new GridLayout(12,1,10,10)); 

    scrollPane = new JScrollPane(); 
    scrollPane.setBackground(Color.RED); 
    scrollPane.add(imageGallery); 

    add(scrollPane, BorderLayout.CENTER); 
    setBackground(Color.GRAY); 
} 


public void addImageToGallery(File file) 
{ 
    if (currentImage <= images.length - 1) 
    { 
     BufferedImage bufImage = null; 

     try 
     { 
      bufImage = ImageIO.read(file); //tries to load the image 
     } 
     catch (Exception e) 
     { 
      System.out.println("Unable to load file " + file.toString()); 
     } 

     Image resizedImage = bufImage.getScaledInstance(bufImage.getWidth()/6, bufImage.getHeight()/6, Image.SCALE_SMOOTH); 
     ImageIcon icon = new ImageIcon(resizedImage); 

     images[currentImage] = new JLabel(icon, JLabel.CENTER); 

     scrollPane.add(images[currentImage]); 
     images[currentImage].setSize(120, 100); 
     scrollPane.add(images[currentImage]); 

     currentImage++; 

     //scrollPane.revalidate(); 
     //scrollPane.repaint(); 
    } 
    else 
    { 
     throw new ArrayIndexOutOfBoundsException("The gallery is full"); 
    } 
} 


public final int getMaxImages() 
{ 
    return MAX_IMAGES; 
} 


public Dimension getPreferredSize() 
{ 
     return new Dimension(300, 700); 
} 

} 

enter image description here

+0

水平または垂直ラップを使用して 'JList'を使用してください。 – MadProgrammer

+0

または[この例のように]何かできます(http://stackoverflow.com/questions/16389620/tiled-image-gallery-in-java/16389729# 16389729) – MadProgrammer

+0

@MadProgrammerこれはギャラリーの利用可能なスペースです。 –

答えて

0
scrollPane.add(images[currentImage]); 
images[currentImage].setSize(120, 100); 
scrollPane.add(images[currentImage]); 

スクロールペインに直接コンポーネントを追加しないでください。

JScrollPaneは、表示するコンポーネントを保持するためにJViewportを使用します。

あなたが使用するJListを使用したいのであれば:

JList<Icon> list = new JList<Icon>(); 
JScrollPane scrollPane = new JScrollPane(list); 
frame.add(scrollPane); 

その後、あなたはJListIcon(ないJLabelの)を追加します。 JListにはすでにIconを表示するカスタムレンダラーがあります。

詳細と動作例については、How to Use ListsのSwingチュートリアルのセクションをお読みください。

このチュートリアルには、How to Use Scroll Panesのセクションもあります。

0

私はこのPanelListCellRendererコンポーネントについてJPanelJListJLabelListCellRenderer

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package javax.swing; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.util.Vector; 
import javax.swing.border.LineBorder; 

/** 
* 
* @author NiRRaNjAN RauT 
*/ 
/** 
* JImagePanel is used to display JList of BufferedImage 
* This class is extended to JPanel 
*/ 
public class JImagePanel extends JPanel { 

    /** 
    * JList is used to display display BufferedImage 
    */ 
    private JList imageList = null; 
    /** 
    * JScrollPane is used to add scroll bar to JList 
    */ 
    JScrollPane scroll_pane = null; 
    /** 
    * Vector<BufferedImage> is used to store the BufferedImages 
    */ 
    Vector<BufferedImage> listData = new Vector<BufferedImage>(); 

    /** 
    * default constructor used to initialize JPanel 
    */ 
    public JImagePanel() { 
     this(null); 
    } 

    /** 
    * @param data 
    * This parameterized constructor is used to 
    * add the vector of BufferedImages to JList 
    */ 
    public JImagePanel(Vector<BufferedImage> data) { 
     setLayout(new BorderLayout()); 
     if(data != null) { 
      listData = data; 
     } 
     imageList = new JList(); 
     imageList.setFixedCellHeight(160); 
     imageList.setFixedCellWidth(160); 
     if(!listData.isEmpty()) { 
      imageList.setListData(listData); 
     } 
     imageList.setCellRenderer(new JCellRenderer()); 
     imageList.setAutoscrolls(true); 
     imageList.setLayoutOrientation(JList.HORIZONTAL_WRAP); 
     imageList.setVisibleRowCount(-1); 
     scroll_pane = new JScrollPane(imageList); 
     this.add(scroll_pane, BorderLayout.CENTER); 
     this.setBorder(new LineBorder(Color.BLUE)); 
    } 

    /** 
    * @param selection 
    * The parameter selection is used to set multi selection on or off 
    * When true, it allows to select multiple images in JList using 
    * Ctrl key. 
    */ 
    public void setMultiSelection(boolean selection) { 
     if(selection) { 
      imageList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
     } else { 
      imageList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     } 
    } 

    public int[] getSelectedIndices() { 
     return imageList.getSelectedIndices(); 
    } 

    public int getImageSize() { 
     return imageList.getModel().getSize(); 
    } 

    /** 
    * @param image 
    * This is used to add BufferedImage to JList 
    * User can add new images to JList at runtime. 
    */ 
    public void addImageToList(BufferedImage image) { 
     listData.add(image); 
     imageList.setListData(listData); 
    } 

    /** 
    * The method is used to clear the old list data. 
    * It sets the list data to empty list. 
    */ 
    public void clear() { 
     listData.clear(); 
     imageList.setListData(listData); 
    } 

    /** 
    * @param data 
    * This method is used to set list data to JList 
    * The data should be Vector of BufferedImage 
    */ 
    public void setListData(Vector<BufferedImage> data) { 
     if(data == null || data.isEmpty()) { 
      System.err.println("Empty Data"); 
      return; 
     } 
     listData = data; 
     imageList.setListData(listData); 
    } 

} 

を使用して、私のCBIRのjavaアプリケーションのためのJImagePanelを作成したが、以下に与えられている必要があります。

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package javax.swing; 

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import javax.swing.border.EmptyBorder; 

/** 
* 
* @author NiRRaNjAN RauT 
*/ 
/** 
* JCellRenderer is extended to JLabel 
* It is used to display the image on JList by implementing ListCellRenderer 
*/ 
public class JCellRenderer extends JLabel implements ListCellRenderer { 

    /** 
    * The width and height is used to set size of a JLabel. 
    * It is default set to 200 * 200 
    */ 
    private static final int width = 140, height = 140; 

    /** 
    * default constructor used to set size of JLabel and set Border to JLabel. 
    */ 
    public JCellRenderer() { 
     setSize(width, height); 
     setOpaque(true); 
     setBorder(new EmptyBorder(10, 10, 10, 10)); 
    } 

    /** 
    * @return Component 
    * it returns JLabel for a cell. 
    * The image from JList is set as icon on JLabel so that it displays the image as a JList item. 
    */ 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     try { 
      if(value instanceof BufferedImage) { 
       BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
       Graphics2D g = image.createGraphics(); 
       g.drawImage((BufferedImage) value, 0, 0, width, height, null); 
       g.dispose(); 
       setIcon(new ImageIcon(image)); 
      } 
      if(isSelected) { 
       setBackground(Color.DARK_GRAY); 
      } else { 
       setBackground(Color.LIGHT_GRAY); 
      } 
     } catch(Exception ex) { 
      System.err.println("" + ex.getMessage()); 
     } 
     return this; 
    } 
} 

これは使い方です。

JFrame frame = new JFrame("Image Panel Demo"); 
frame.setResizable(true); 
frame.setSize(500, 500); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
JImagePanel panel = new JImagePanel(); 
panel.setMultiSelection(true); 
frame.setLayout(new BorderLayout()); 
frame.add(panel, BorderLayout.CENTER); 
frame.setVisible(true); 
try { 
    File files[] = new File("/SOFTWARES/NETBEANS_PROJECTS/BE/S_CBIR/dataset").listFiles(); 
    for(File file : files) { 
     BufferedImage image = ImageIO.read(file); 
     panel.addImageToList(image); 
    } 
} catch (Exception e) { 
    e.printStackTrace(System.err); 
} 

希望します。

+1

JLabelを拡張しないでください。代わりに、JLabelであるデフォルトのレンダラーを拡張します。このクラスには、描画をより効率的にするための実装が空のいくつかのメソッドがあります。 – camickr

+0

@ELITE私はJLabels上に画像を追加して表示することができました。あなたのコードは削除のための機能を提供していますか? –

+0

いいえ、インデックス 'listData.remove(index);'を使い、 'imageList.setListData(listData);'メソッドを呼び出すことで、deleteメソッドを追加し、 'Vector'から要素を削除する必要があります。 – ELITE

関連する問題