[英]java swing - painting multiple jpanels on the same jframe
只是作为序言,我已经寻找了几个小时试图在此处和其他几个站点上找到解决方案。 如果您发现我可能遗漏的问题,请告诉我。
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
最终编辑
我显然不是很理解,所以我决定采取不同的方法 - 我正在使用 JLabels 并制作图标。 效果很好,谢谢大家的帮助
您的panel
设置为 BorderLayout,您为每个缩略图调用panel.add()
。 该方法将给定的组件设置到 BorderLayout 的中间,替换那里的任何内容,这就是为什么您只看到添加的最后一个。 BorderLayout 不会为缩略图执行您想要的操作。
我希望你想要 GridLayout; 它以行和列的形式排列添加到其中的组件。 将您的panel
设置为 GridLayout(或您想要布局缩略图的任何其他内容),并将缩略图添加到其中。 然后把panel
放在任何你想要的地方; 默认情况下,JFrame 上有一个 Borderlayout,您可能希望将panel
放在它的中间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.