首先,我想告诉大家我只是一个初学者,我尝试过很多事情但没有成功。
我已经设法制作了一个JFrame,然后是一个JPanel,在JPanel中,一个带有图标的JLabel。我可以使用按钮JFileChooser
检索图片,图片会调整大小以适合JLabel
。
我的项目有5个文件:
ImageFilter
:由LoadFiles
ImagePreview
:由LoadFiles
LoadFiles
:JFileChooser
class NewJFrame
Utils
:由LoadFiles
我正在使用NetBeans IDE和GUI Builder,我创建了我的类LoadFiles(JFileChooser),因此我只需要在NewJFrame上删除该类,并且该按钮出现在我的JFrame上,这样我的程序就可以轻松修改(Every class是一个模块,但只有一个是LoadFiles,除了在我的NewJFrame中声明的变量之外什么都没有。
以下是我的程序的样子:
我想添加两个按钮,Next和Previous,在我已经在JLabel中打开的图片之间导航。
LoadFiles
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
public class LoadFiles extends JButton implements ActionListener {
JFileChooser jfc;
public LoadFiles() {
super("Load");
addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (jfc == null) {
jfc = new JFileChooser(".");
jfc.addChoosableFileFilter(new ImageFilter());
jfc.setAcceptAllFileFilterUsed(false);
jfc.setAccessory(new ImagePreview(jfc));
}
jfc.setDialogTitle("test");
int result = jfc.showOpenDialog(null);
if(result == JFileChooser.APPROVE_OPTION) {
File file = jfc.getSelectedFile();
System.out.println(file.getParent());
System.out.println(file.getName());
// Read image and place new file icon into preferred locations
BufferedImage newImage = null;
try {
newImage = ImageIO.read(file);
} catch(IOException ex) {
System.out.println("red error: " + ex.getMessage());
}
ImageIcon backgdIcon = new ImageIcon(newImage);
Image zoom = getScaledImage(backgdIcon.getImage(), 471, 189);
Icon iconScaled = new ImageIcon(zoom);
NewJFrame.jLabel1.setIcon(iconScaled);
} else if (result == JFileChooser.CANCEL_OPTION) {
System.out.println(JFileChooser.CANCEL_OPTION);
}
}
private Image getScaledImage(Image srcImg, int w, int h){
BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = resizedImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(srcImg, 0, 0, w, h, null);
g2.dispose();
return resizedImg;
} }
你可以在这里找到我的节目: http://www.speedyshare.com/k6e5r/javaapplication29.7z
拜托,你能帮助我吗?
编辑1 - 感谢您的评论,我无法尽快回答。我会尝试你正在谈论的MadProgrammer和Andrew Thompson。我稍后会回复你,希望我能让它发挥作用。
我还记得我的下一篇文章要做得更好(MCVE)。
Joop Eggen - 我不想在JFileChooser中制作预览图标,我已经有了。我希望能够使用上一个按钮(不是预览)检索我添加到JLabel的最后一个图像。无论如何,谢谢你的回复。
编辑2 - 感谢您的建议mbw,当我这样做时,我想到的是我可以在任何应用程序中使用该classe,只需将其放在GUI上,它可以通过查找变量的名称在任何地方工作但是你是是的,与其他人保持联系并不容易。
我想在JFrame中尽可能减少代码,因此它可以是最模块化的代码。
我可能会像你说的那样。
编辑3 - 最后我成功了,
我在课堂上宣布这一点:
List<BufferedImage> images;
int currentImage = 0;
然后我将图像放入BufferedImage
//bufferedimage dans la arraylist
if(images == null)
images = new ArrayList<BufferedImage>();
images.add(newImage);
currentImage = images.size() - 1;
我做了两种方法
public void nextImage() {
if(images != null && images.get(currentImage + 1) != null )
{
ImageIcon backgdIcon = new ImageIcon(images.get(currentImage + 1));
Image zoom = getScaledImage(backgdIcon.getImage(), 471, 189);//taille en pixels
Icon iconScaled = new ImageIcon(zoom);
NewJFrame.jLabel1.setIcon(iconScaled);
}
}
public void prevImage() {
if(images != null && images.get(currentImage - 1) != null )
{
ImageIcon backgdIcon = new ImageIcon(images.get(currentImage - 1));
Image zoom = getScaledImage(backgdIcon.getImage(), 471, 189);//taille en pixels
Icon iconScaled = new ImageIcon(zoom);
NewJFrame.jLabel1.setIcon(iconScaled);
}
}
感谢大家的所有建议。祝你有个美好的一天。
答案 0 :(得分:0)
评论中有一些好主意,但我认为如果更改代码结构会更容易。
如果我是你,我不会创建扩展JButton并为每个按钮创建一个自定义类。它确实使事情变得复杂,并且使得将gui周围的信息传递给需要它的不同组件变得更加困难。
相反,为了使代码更容易阅读,我将使用netbeans gui构建器在JFrame中创建三个JButton:Load,next和previous。然后,您可以轻松地为每个按钮添加一个动作事件侦听器,并在JFrame中完成所有工作。这也使得对下一个和上一个按钮的所有加载图片的引用变得非常容易。