请原谅我,如果这很难遵循,但我有一个特定的问题,我需要帮助解决.我已经做了大量的研究,我尝试了很多解决方案,但没有一个能够正常工作.
我的问题是我有一个扩展JPanel的ImagePanel类(下面的代码),这个类需要使用宽度和高度来缩放图像(我正在创建一个程序,用户可以创建自定义教程,包括图像).当我实例化这个时,我得到一个错误,说宽度和高度必须非零.我知道这是因为布局管理器尚未将ImagePanel传递给首选大小,但我不知道如何将该大小传递给面板. ImagePanel位于JPanel内部,该Jalit内部位于JFrame内JSplitPane内部的JTabbedPane内部的JPanel内部的JScrollPane内部的JSplitPane内部.递减容器顺序的图形表示如下:
> JFrame(GridLayout)
> JSplitPane(默认SplitPane布局)
> JTabbedPane(Deault JTabbedPane布局)
> JPanel(GridLayout)
> JScrollPane(默认ScrollPane布局)
> JSplitPane(默认SplitPane布局)
> JPanel(GridLayout);
> ImagePanel
ImagePanel的代码如下:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class ImagePanel extends JPanel{
private BufferedImage i;
private ImageIcon miniature;
private Image paint = null;
public void createImage(String path){
try {
i = ImageIO.read(new File(path));
} catch (IOException ex) {
ex.printStackTrace();
}
if(i != null){
int width = (int)((double)i.getWidth() * ((double)getWidth()/i.getWidth()));
int height = (int)((double)i.getHeight()*i.getHeight()/i.getWidth()*((double)this.getHeight()/i.getHeight()));
miniature = new ImageIcon(i.getScaledInstance(width, height, Image.SCALE_SMOOTH));
paint = miniature.getImage();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (paint!=null){
g.drawImage(paint, 0, 0, null);}
}
}
如何获得ImagePanel的正确大小.我希望图像改变大小与JFrame的大小,这就是为什么我不只是使用setPreferedSize();.