使用JPanel扩展类设置背景 [英] Using a JPanel extension class to set a background

查看:177
本文介绍了使用JPanel扩展类设置背景的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的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.

  1. 创建一个Java项目
  2. 提供任何项目名称.就我而言,我正在使用 SwingTest 如图所示
  3. 提供包裹名称.就我而言,我正在使用 swingtest 如图所示
  4. 右键单击源软件包. 新建-> Java程序包.在下面 在新Java程序包窗口中,提供程序包名称,在我的情况下,我正在使用图像
  5. 文件系统复制图像,然后移回 NetBeans IDE,右键单击如此创建的 images 程序包,然后将图像粘贴到NetBeans IDE中
  6. 通过右键单击 swingtest 包,新建->,创建两个类 Java类,其内容如下所示
  1. Create a Java Project
  2. Provide any Project Name. In my case I am using SwingTest, as shown in image
  3. Provide Package Name. In my case I am using swingtest, as shown in image
  4. Right-click Source Packages. New -> Java Package. Under New Java Package window, provide Package Name, in my case I am using images
  5. 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)
  6. 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:

  1. 转到工具->面板-> Swing/AWT组件
  2. 点击新类别.在新调色板类别窗口中, 提供新类别名称
  3. 点击 确定 并关闭 Palette Manager 窗口
  4. 在编辑器中打开 ImagePanel ,现在选择 Source View ,现在 选择工具->添加到选用板,然后仅选择类别 由您创建.
  5. 我想会的.现在可以在 Palette 窗口,在先前选择的 Category 下,可以将其拖放到JFrame/JComponent上.
  1. Go to Tools -> Palette -> Swing/AWT Components
  2. Click on New Categroy. in New Palette Category window, provide New Category Name
  3. Click OK and Close the Palette Manager window
  4. Open ImagePanel in editor, now select Source View, now select Tools -> Add to Palette and select the Category just created by you.
  5. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆