使用JPanel扩展类设置背景 [英] Using a JPanel extension class to set a background
问题描述
在我的Main
中,我想创建一个JFrame
,然后我想创建一个BackgroundPanel
,然后将其添加到JFrame
中.
In my Main
I want to create a JFrame
, then I want to create a BackgroundPanel
and I want to add this one in the JFrame
.
这是 Main 类:
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
即可.
请帮帮我!
When I execute it, there are no errors, simply it put out a normal JFrame
without background.
Help me Please!
@nIcEcOw我在第一个回答中使用了代码将图像打印在JPanel上.但是当我执行它时,输出错误.
@nIcEcOw I used the code in the first answear to print my image on a JPanel. But when I execute it, there's an error in output.
此错误:
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)
我对项目的结构感到困惑. 我注意到我不能将package文件夹放在bin目录中;这在我的思想上造成了冲突. 我不明白如何将Java文件放入src中并将package文件夹放入bin目录中. 我的Java文件位于程序包文件夹中.如何执行此操作?
I'm confused about project's structure. I noticed that i can't put the package folder in bin directory; this creates a conflict in my ide. I dont understand how i can put the java files in src and the package folder in bin directory. My java files are in package folder..how I can do this?
我正在使用NetBeans IDE 8.0
I'm using NetBeans IDE 8.0
我使用了NetBean的图像导入教程,并且还提示我创建另一个用于在其中导入图像的程序包. 现在我的代码是:
I red NetBean's image importing tutorial, and there also tips me to create another package to import images within. Now I the code is:
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 现在一切正常. 但又是另一回事:
@nIcEcOw you're my hero! :D Now all works fine. But just another thing:
现在我在更大的项目中使用您的ImagePanel类. 我还在项目的Main类中使用了SwingTest代码的一部分,以创建一个具有ImagePanel背景的自定义jframe类(FramePrincipale)的框架.当我执行时,我用我的bakcground获得了一个框架,但是我定制的jframe中没有其他的swing元素(labels,textfields ..). 我该如何解决?
now I'm using your ImagePanel class in a bigger project. I'm also using part of SwingTest code in the Main class of project to create a frame of a customized jframe class (FramePrincipale) with ImagePanel background. When I execute I'm obtaining a frame with my bakcground, but there aren't the other swing elements (labels,textfields..) that are part of my customized jframe. How can I fix this?
这是Principale类(主项目类):
this is Principale class (main project class):
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表单.
FramePrincipale is a JFrame Form that is in the same project.
@nIcEcOw:现在可以了!谢谢大家! :-)
@nIcEcOw: Now it works! Thank You for all man! :-)
推荐答案
考虑到项目的目录结构,如下所示:
Considering that the directory structure for the project looks like this:
Since Images are Application Resources,
it's always best to access them in the
form of a URL, instead of File, as you are doing.
Uncomment this below line and watch this answer
of mine, as to HOW TO ADD IMAGES TO THE PROJECT
https://stackoverflow.com/a/9866659/1057230
In order to access images with getClass().getResource(path)
here your Directory structure has to be like this
Project
|
------------------------
| |
bin src
| |
--------- .java files
| |
package images(folder)
( or |
.class 404error.jpg
files, if
no package
exists.)
PaintingExample
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class PaintingExample {
private ImagePanel imagePanel;
private 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() {
try {
imageIcon = new ImageIcon(ImageIO.read(ImagePanel.class.getResource(
"/images/aeroplaneright.jpeg")));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
@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);
}
}
输出:
如编辑中所述,您使用某些Integrated Development Environment - IDE
来创建应用程序.因为,每个IDE
都以不同的方式工作.请参阅这篇文章是否有关如何将图像添加到Java Project 的相关知识,
As mentioned in the edit, that you using some Integrated Development Environment - IDE
, for creating the application. Since, every IDE
use to work in a bit different way. Please see, if this post, regarding how to add images to Java Project, helps you in that direction.
- 创建一个Java项目
- 提供任何项目名称.就我而言,我正在使用 SwingTest 如图所示
- 提供包裹名称.就我而言,我正在使用 swingtest 如图所示
- 右键单击源软件包. 新建-> Java程序包.在下面 在新Java程序包窗口中,提供程序包名称,在我的情况下,我正在使用图像
- 从文件系统复制图像,然后移回 NetBeans IDE,右键单击如此创建的 images 程序包,然后将图像粘贴到NetBeans IDE中
- 通过右键单击 swingtest 包,新建->,创建两个类 Java类,其内容如下所示
- Create a Java Project
- Provide any Project Name. In my case I am using SwingTest, as shown in image
- Provide Package Name. In my case I am using swingtest, as shown in image
- Right-click Source Packages. New -> Java Package. Under New Java Package window, provide Package Name, in my case I am using images
- Copy the image from the File System and move back to NetBeans IDE, Right-click the images package so created and paste the image(inside NetBeans IDE)
- Create two classes by Right-clicking swingtest package, New -> Java Class, the contents of which are shown below
就是这样,您现在就完成了.运行该项目,您将能够看到图像.一定要注意getClass().getResource(...)
thingy的使用:
That is it, you are done now. Run the Project, and you be able to see the images. Do watch the use of getClass().getResource(...)
thingy:
imageIcon = new ImageIcon(ImageIO.read(ImagePanel.class.getResource(
"/images/loyalperson.jpg")));
SwingTest
package swingtest;
import java.awt.*;
import javax.swing.*;
public class SwingTest {
private ImagePanel imagePanel;
private 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 SwingTest().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}
ImagePanel
package swingtest;
import java.awt.Dimension;
import java.awt.Graphics;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class ImagePanel extends JPanel {
private ImageIcon imageIcon;
public ImagePanel() {
try {
imageIcon = new ImageIcon(ImageIO.read(
ImagePanel.class.getResource("/images/loyalperson.jpg")));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
@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);
}
}
带有图片的步骤
此处是 loyalperson.jpg
要添加自定义组件,请执行以下操作:
For adding a customized component, do this:
- 转到工具->面板-> Swing/AWT组件
- 点击新类别.在新调色板类别窗口中, 提供新类别名称
- 点击 确定 并关闭 Palette Manager 窗口
- 在编辑器中打开 ImagePanel ,现在选择 Source View ,现在 选择工具->添加到选用板,然后仅选择类别 由您创建.
- 我想会的.现在可以在 Palette 窗口,在先前选择的 Category 下,可以将其拖放到JFrame/JComponent上.
- Go to Tools -> Palette -> Swing/AWT Components
- Click on New Categroy. in New Palette Category window, provide New Category Name
- Click OK and Close the Palette Manager window
- Open ImagePanel in editor, now select Source View, now select Tools -> Add to Palette and select the Category just created by you.
- That I guess, will do. Now the component can be seen on the Palette window, under the Category chosen previously, which one can drag/drop on to the JFrame/JComponent.
这篇关于使用JPanel扩展类设置背景的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!