[英]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 的“簡單”方法是使用Image
或ImageIcon
。
第一步是將圖像“嵌入”到應用程序上下文中(假設您不允許用戶選擇圖像)。 如何完成這將取決於您的 IDE 和構建系統(當您不使用 Maven 時,Eclipse 和 Netbeans 允許您簡單地將它們包含在src
文件夾中)。
接下來,您想使用Class#getResource
來獲取對嵌入資源的URL
引用。 在這種情況下,您可以使用ImageIO.read
、 ImageIcon(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
作為背景容器的原因。
現在,我們需要做的就是加載圖像,將其傳遞到背景,將我們需要的任何內容添加到組件並顯示它,這很簡單,或者至少應該是這樣。 ImageIcon
和Toolkit#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.