簡體   English   中英

如何將圖像添加到 JFrame

[英]how to add image to the JFrame

我需要幫助才能將圖像添加到單獨的 JFrame,但我似乎無法讓它工作。 就像我希望圖像在單獨的框架中打開一樣,當我運行此代碼時,它會打開一個空白的 JFrame。 d 幫助將圖像添加到單獨的 JFrame,但我似乎無法讓它工作。 就像我希望圖像在單獨的框架中打開一樣,當我運行此代碼時,它會打開一個空白的 JFrame。

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*;
import javax.swing.JFrame;
class PPJJ extends JFrame implements ActionListener, KeyListener 
{   

public void paint(Graphics g) {  
  
        Toolkit t=Toolkit.getDefaultToolkit();  
        Image i=t.getImage("tenor.gif");  
        g.drawImage(i, 120,100,this);  
          
    }  
    public static void main(String[] args) 
    {
        
        JFrame frame = new JFrame("VOLUNTEER FOR THING"); 
        
        PPJJ obj = new PPJJ(); 
        
        JPanel panel = new JPanel(); 
        
        JLabel lname = new JLabel("Enter your name here");
        JTextField tname = new JTextField(21);
        JButton btn = new JButton("Click"); 
        
        btn.addActionListener(obj); 
        
        tname.addKeyListener(obj); 
        
        panel.add(lname);
        panel.add(tname);
        panel.add(btn); 
        frame.add(panel); 
        frame.setSize(300, 130); 
        frame.show(); 
        frame.setLocationRelativeTo(null);
        
         PPJJ m = new PPJJ();  
        JFrame f =new JFrame();  
        //f.add(m);  
        f.setSize(500,500);  
        f.setVisible(true);  
        frame.add(new JLabel(new ImageIcon("volunteer.jpeg")));

    } 
  
    public void actionPerformed(ActionEvent e) 
    {
        String s = e.getActionCommand(); 
        if(s.equals("Click here")){
            JOptionPane.showMessageDialog(null , "THANKS FOR SIGNING UP");
        } 
    } 
  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode()==KeyEvent.VK_ENTER){
      JOptionPane.showMessageDialog(null , "THANKS FOR SIGNING UP");
    }
  }
    @Override
    public void keyReleased(KeyEvent arg) {}
    @Override
    public void keyTyped(KeyEvent arg) {}
}

哦,動畫 GIF 😓。

在大多數情況下,圖像處理並不簡單,但動畫 GIF 完全是另一種痛苦……我的意思是很有趣。

通常,我更喜歡使用ImageIO.read ,但ImageIO返回一個BufferedImage並且(很容易)不可能通過它渲染動畫 GIF。

顯示動畫 GIF 的“簡單”方法是使用ImageImageIcon

第一步是將圖像“嵌入”到應用程序上下文中(假設您不允許用戶選擇圖像)。 如何完成這將取決於您的 IDE 和構建系統(當您不使用 Maven 時,Eclipse 和 Netbeans 允許您簡單地將它們包含在src文件夾中)。

接下來,您想使用Class#getResource來獲取對嵌入資源的URL引用。 在這種情況下,您可以使用ImageIO.readImageIcon(URL)Toolkit#getImage(URL)來加載圖像。 但是,正如我所說, ImageIO.read不會幫助您。

接下來,您需要一個可以渲染圖像的組件,幸運的是,Swing 可以神奇地自動執行此操作,我們需要做的就是確保該組件作為ImageObserver引用傳遞,例如...

public class BackgroundPane extends JPanel {
    private Image image;

    public BackgroundPane(Image image) {
        this.image = image;
    }

    @Override
    public Dimension getPreferredSize() {
        Image image = getBackgroundImage();
        return image == null ? super.getPreferredSize() : new Dimension(image.getWidth(this), image.getHeight(this));
    }

    public Image getBackgroundImage() {
        return image;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Image image = getBackgroundImage();
        if (image == null) {
            return;
        }
        int x = (getWidth() - image.getWidth(this)) / 2;
        int y = (getHeight() - image.getHeight(this)) / 2;
        g.drawImage(image, x, y, this);
    }
    
}

另外,請注意, JLabel也通過其icon屬性支持動畫 GIF,但請查看如何在 JPanel 中設置背景圖片,了解不應使用JLabel作為背景容器的原因。

現在,我們需要做的就是加載圖像,將其傳遞到背景,將我們需要的任何內容添加到組件並顯示它,這很簡單,或者至少應該是這樣。 ImageIconToolkit#getImage都將圖像的讀取加載到后台線程,因此在加載圖像之前檢查圖像尺寸將返回0x0 😓,因此,我們需要等待它加載(這就是為什么我更喜歡ImageIO.read因為在加載圖像或發生錯誤之前它不會返回)。

就像是...

Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/images/kitty.gif"));
BackgroundPane backgroundPane = new BackgroundPane(image);
// Did I mention I had this workflow, but ImageIO doesn't
// support animated images, without a lot of work
MediaTracker mt = new MediaTracker(backgroundPane);
mt.addImage(image, 0);
mt.waitForAll();
// The image is now loaded, hooray for us

可運行的示例...

在此處輸入圖像描述

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/images/kitty.gif"));
                    BackgroundPane backgroundPane = new BackgroundPane(image);
                    // Did I mention I had this workflow, but ImageIO doesn't
                    // support animated images, without a lot of work
                    MediaTracker mt = new MediaTracker(backgroundPane);
                    mt.addImage(image, 0);
                    mt.waitForAll();

                    backgroundPane.setLayout(new GridBagLayout());
                    JLabel label = new JLabel("All your kitty is belong to us");
                    label.setForeground(Color.WHITE);
                    backgroundPane.add(label);

                    JFrame frame = new JFrame();
                    frame.add(backgroundPane);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    public class BackgroundPane extends JPanel {
        private Image image;

        public BackgroundPane(Image image) {
            this.image = image;
        }

        @Override
        public Dimension getPreferredSize() {
            Image image = getBackgroundImage();
            return image == null ? super.getPreferredSize() : new Dimension(image.getWidth(this), image.getHeight(this));
        }

        public Image getBackgroundImage() {
            return image;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Image image = getBackgroundImage();
            if (image == null) {
                return;
            }
            int x = (getWidth() - image.getWidth(this)) / 2;
            int y = (getHeight() - image.getHeight(this)) / 2;
            g.drawImage(image, x, y, this);
        }

    }
}

請注意...

如果您不使用動畫 GIF,那么您可以只使用ImageIO.read而不是Toolkit#getImage並且您不需要等待(因為ImageIO.read在當前線程中工作),在這種情況下代碼看起來更像...

try {
    BackgroundPane backgroundPane = new BackgroundPane(ImageIO.read(getClass().getResource("/images/kitty.gif")));
    backgroundPane.setLayout(new GridBagLayout());
    JLabel label = new JLabel("All your kitty is belong to us");
    label.setForeground(Color.WHITE);
    backgroundPane.add(label);

    JFrame frame = new JFrame();
    frame.add(backgroundPane);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
} catch (IOException ex) {
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

BackgroundPane代碼不變)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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