[英]How to display an image as a background on a JPanel
當我根據JPanel的大小重新縮放圖像時,我在JPanel上顯示圖像時遇到問題。 圖像沒有出現。
public class createGUII extends JFrame{
String [] background = {"c1.jpg","c2.jpg","c3.jpg","c4.jpg"};
ArrayList<String> bgPicturesFiles = new ArrayList<String>(Arrays.asList(background));
JPanel panel;
ImagePanel imgBg;
public createGUII(){
GridBagLayout m = new GridBagLayout();
Container c = getContentPane();
c.setLayout (m);
GridBagConstraints con = new GridBagConstraints();
//Panel for background
panel = new JPanel();
panel.setSize(600, 600);
con = new GridBagConstraints();
con.anchor=GridBagConstraints.CENTER;
con.gridy = 1; con.gridx = 0;
con.gridwidth = 1; con.gridheight = 1;
m.setConstraints(panel, con);
c.add(panel);
//randomized the image files
Random r = new Random();
int random = r.nextInt(bgPicturesFiles.size());
//rescale the image according to the size of the JPanel
imgBg = new ImagePanel(new ImageIcon(bgPicturesFiles.get(random)).getImage().getScaledInstance(panel.getHeight(), panel.getWidth(),Image.SCALE_SMOOTH));
panel.add(imgBg);
setResizable(false);
setVisible(true);
setExtendedState(getExtendedState()|JFrame.MAXIMIZED_BOTH);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new createGUII();
}
});
}
}
class ImagePanel extends JPanel {
private Image img;
public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}
public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
}
public void paintComponent(Graphics g) {
g.drawImage(img, 0, 0, null);
}
}
看看這個: JPanel背景圖片 , 帶背景圖片的JPanel,其他面板重疊
第二個鏈接提到您必須為縮放做一些自定義繪畫。 這是個問題。 我不會縮放圖像中的paintComponent方法每一次,但如果寬度和高度已經自上次調用改變做一次 ,而在這種情況下,重新創建包含您的blit之前每一次的圖像的BufferedImage調用超類paintComponent,縮放到正確的大小( 當原始圖像高度和寬度小於縮放高度和寬度時,使用像縮放這樣的東西不起作用 )。 我可以看到一個問題,當你調用超類paintComponent方法時,它可能會嘗試用顏色填充面板,但你必須進行實驗。
我沒有看到你實際閱讀圖像的位置,如本例所示。
附錄:我添加了縮放示例。 另請參見不要使用getScaledInstance()
和的危險Image.getScaledInstance()
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/questions/4170463 */
public class LoadImage extends JPanel {
private Image image;
public LoadImage() {
super(new GridLayout());
try {
image = ImageIO.read(new File("image.jpg"));
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
int w = image.getWidth(null) / 2;
int h = image.getHeight(null) / 2;
this.add(new JLabel(new ImageIcon(
image.getScaledInstance(w, h, Image.SCALE_SMOOTH))));
}
private void display() {
JFrame f = new JFrame("LoadImage");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new LoadImage().display();
}
});
}
}
問題是在Java圖像中異步加載。 由於以下原因,上述代碼存在以下問題:
new Dimension(600, 600)
即將其更改為new Dimension(600, 600)
),也可能無法加載圖像本身。 要確保加載,請添加以下內容:
new ImageIcon(img).getImage();
在此之后this.img = img;
在ImagePanel的構造函數中。
請注意,這部分是一個黑客 - 我不是一個GUI專家,但我知道上面寫得更好。 也許其他人可能會有更多的光明。
以下是一些可能有用的鏈接:
希望這可以幫助。
這是一個應該有用的鏈接 。 然而,我發現了一種更適合我所遇到的問題的方法, 這就是我所發現的,以下是我從中得到的。
我希望這有幫助。
Container con = getContentPane();
final String backgroundPath = "C:\\background.jpg";
ImageIcon imh = new ImageIcon(backgroundPath);
setSize(imh.getIconWidth(), imh.getIconHeight());
JPanel pnlBackground = new JPanel()
{
public void paintComponent(Graphics g)
{
Image img = new ImageIcon(backgroundPath).getImage();
g.drawImage(img, 0, 0, null);
}
};
con.add(pnlBackground);
pnlBackground.setBounds(0, 0, imh.getIconWidth(), imh.getIconHeight());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.