【发布时间】:2014-07-17 15:39:24
【问题描述】:
在我的Main 中,我想创建一个JFrame,然后我想创建一个BackgroundPanel,我想在JFrame 中添加这个。
这是主类:
public class Main {
public static void main(String args[]) {
Frame frame = new Frame();
BackgroundPanel back = new BackgroundPanel();
frame.getContentPane().add(back);
frame.setSize(400, 287);
frame.setVisible(true);
}
}
这是 BackgroundPanel 类:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BackgroundPanel extends JPanel {
private Image img;
public BackgroundPanel() {
img = Toolkit.getDefaultToolkit().createImage(getClass().getResource("sfondo.png"));
loadImage(img);
}
private void loadImage(Image img) {
try {
MediaTracker track = new MediaTracker(this);
track.addImage(img, 0);
track.waitForID(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
setOpaque(false);
g.drawImage(img, 0, 0, null);
}
}
而JFrame 是一个普通的JFrame 类。
当我执行它时,没有错误,只是它输出了一个没有背景的普通JFrame。
请帮帮我!
@nIcEcOw 我使用第一个答案中的代码在 JPanel 上打印我的图像。但是当我执行它时,输出有错误。
这是错误:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1388)
at paintingexample.CustomPanel.<init>(PaintingExample.java:82)
at paintingexample.PaintingExample.displayGUI(PaintingExample.java:28)
at paintingexample.PaintingExample.access$000(PaintingExample.java:19)
at paintingexample.PaintingExample$1.run(PaintingExample.java:42)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
BUILD SUCCESSFUL (total time: 1 second)
我对项目的结构感到困惑。 我注意到我不能将包文件夹放在 bin 目录中;这在我的想法中产生了冲突。 我不明白如何将 java 文件放在 src 中,将包文件夹放在 bin 目录中。 我的 java 文件在包文件夹中。我该怎么做?
我使用的是 NetBeans IDE 8.0
我红了 NetBean 的图片导入教程,里面还提示我创建另一个包来导入图片。 现在我的代码是:
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class PaintingExample {
private ImagePanel imagePanel;
public void displayGUI() {
JFrame frame = new JFrame("Swing Worker Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel();
imagePanel = new ImagePanel();
contentPane.add(imagePanel);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new PaintingExample().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}
class ImagePanel extends JPanel {
private ImageIcon imageIcon;
public ImagePanel() {
imageIcon = new javax.swing.ImageIcon(getClass().getResource("/org/me/myimageapp/newpackage/Schema elettrico divella rev 2014-Model.jpg"));
}
@Override
public Dimension getPreferredSize() {
return (imageIcon == null ? new Dimension(100, 100): new Dimension(
imageIcon.getIconWidth(), imageIcon.getIconHeight()));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(imageIcon.getImage(), 0, 0, this);
}
}
我变了:
imageIcon = new ImageIcon(ImageIO.read(ImagePanel.class.getResource(
"/images/aeroplaneright.jpeg")));
在
imageIcon = new javax.swing.ImageIcon(getClass().getResource("/org/me/myimageapp/newpackage/aeroplaneright.jpg"));
@nIcEcOw 你是我的英雄! :D 现在一切正常。 但只是另一件事:
现在我在一个更大的项目中使用您的 ImagePanel 类。 我还在项目的 Main 类中使用 SwingTest 代码的一部分来创建具有 ImagePanel 背景的自定义 jframe 类 (FramePrincipale) 的框架。当我执行时,我用我的 bakcground 获得了一个框架,但是我的自定义 jframe 中没有其他摆动元素(标签、文本字段 ..)。 我该如何解决这个问题?
这是 Principale 类(主项目类):
import java.awt.EventQueue;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;
public class Principale {
private ImagePanel imagePanel;
private static FramePrincipale frame = new FramePrincipale();
private void displayGUI() throws IOException {
JPanel contentPane = new JPanel();
imagePanel = new ImagePanel();
contentPane.add(imagePanel);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
new Principale().displayGUI();
} catch (IOException ex) {
Logger.getLogger(Principale.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
EventQueue.invokeLater(runnable);
while (true) {
frame.scriviLabel();
}
}
}
FramePrincipale 是同一个项目中的 JFrame Form。
@nIcEcOw:现在可以了!谢谢你所有的人! :-)
【问题讨论】:
-
这是一个 Swing 应用程序,所以使用
JFrame而不是 Frame。 -
@gesualdo:请编辑您的问题(不要在评论中添加东西,这里很难阅读),以及您尝试访问图像的方式。关于项目目录结构的一些想法也会有所帮助。
-
你的代码中
ImageIO在哪里使用? -
点击
read more也可以找到项目结构。
标签: java swing jpanel drawimage