如果難以理解,請原諒我,但我有一個特殊問題,我需要幫助解決。我做了大量的研究,並且嘗試了很多解決方案,但是他們都沒有工作。我的問題是我有一個ImagePanel
類正在擴展JPanel
(代碼如下),這個類需要使用寬度和高度來縮放圖像(我正在製作一個程序,用戶可以在其中創建自定義教程,包括圖像)。當我實例化這個時,我得到一個錯誤,指出寬度和高度必須非零。我知道這是因爲佈局管理器尚未通過ImagePanel
的首選大小,但我不知道如何將該大小設置爲面板。 ImagePanel
位於JPanel
的內部,其在JSplitPane
的內部,JScrollPane
的內部,JPanel
的內部,JTabbedPane
的內部,JSplitPane
的內部,JFrame
的內部。這在降低容器順序的圖形表示如下:JPanel的寬度和高度都是0(具體情況)
- 的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();
。
爲什麼不使用'JLabel(ImageIcon)'?而不是去創建自己的'ImagePanel'。 – Muel
@Muel'JLabel'不會自動重新縮放圖像,所以你需要在某個層次上做一些工作,只是說;) – MadProgrammer
@MadProgrammer呵呵我忘了。我必須承認,自從我使用Swing以來已經有很多年了。 :) – Muel