只是爲了序言,我已經找了幾個小時試圖在這裏和其他幾個網站上找到解決方案。如果您發現我可能錯過的問題,請告訴我。java swing - 在同一個jframe上繪製多個jpanels
Anywho,我試圖創建一個縮略圖查看器,顯示4個縮略圖(在jpanels中)和4個字幕。我可以畫出所有4個縮略圖,但它們都是相同的圖像(最後一幅畫的重複圖)。我認爲這是我試圖重新繪製它們的一部分,但我無法弄清楚要改變什麼。 imageAlbum是一個jpg路徑的ArrayList。
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)爲了更快地獲得更好的幫助,請發佈[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)(是) –
[*]添加thumnails春天佈局像網格?*](http://stackoverflow.com/q/15961412/230513)。 – trashgod
我已經添加了ImageAlbum類 - 不知道如何將圖像從4減少到2將有所幫助,雖然 –