簡體   English   中英

如何在JPanel上將圖像顯示為背景

[英]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圖像中異步加載。 由於以下原因,上述代碼存在以下問題:

  • 圖像不會被加載,因此它的尺寸為(-1,-1)。 因此,ImagePanel的大小無效
  • 即使手動設置new Dimension(600, 600)即將其更改為new Dimension(600, 600) ),也可能無法加載圖像本身。
  • JFrame調整大小已禁用。 如果您允許它,您將能夠通過人工制作Swing加載圖像來調整JFrame調整大小時使用上面的代碼繪制圖像

要確保加載,請添加以下內容:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM