swing-窗体添加背景图片的2种方法

在美化程序时,常常需要在窗体上添加背景图片。通过搜索和测试,发现了2种有效方式。下面分别介绍。
1.利用JLabel加载图片
利用JLabel自带的setIcon(Icon icon)加载icon,并设置JLabel对象的位置和大小使其完全覆盖窗体。这是一个很取巧的办法,代码非常简单,如下所示。

JLabel lbBg = new JLabel(imageIcon);
lbBg.setBounds(0, 0, frameSize.width, frameSize.height);
this.getContentPane().add(lbBg);

 

然而这种方法有几个要注意的点:
(1)不能使用布局管理器
此时你需要将布局管理器设置为null,然后精确控制所有控件的大小和位置。否则,JLabel无法完整覆盖窗体。
(2)应当先添加背景JLabel,再添加其它控件。否则其它控件将被JLabel所遮挡(为什么不是后添加的遮挡先添加的?)。
(3)由于控件及窗体的尺寸需要手动控制,因此无法对背景图片进行缩放。

2.重载JPanel的paintComponent(Graphics g)方法
通过重载该方法,在JPanel的绘制阶段将指定图片绘制上去即可。由于背景是绘制出来的,因此不会对布局有任何影响。
示例代码如下:

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, d.width, d.height, this);
MainFrame.instance().repaint();
}

 

下面是一个完整的demo。

 

package frame;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class ImageFrame extends JFrame {

    class ImagePanel extends JPanel {
        Dimension d;
        Image image;

        public ImagePanel(Dimension d, Image image) {
            super();
            this.d = d;
            this.image = image;
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, d.width, d.height, this);
            MainFrame.instance().repaint();
        }
    }

    Dimension frameSize = new Dimension(500, 300);
    ImageIcon imageIcon = new ImageIcon(this.getClass().getResource(
            "/images/bg.jpg"));

    public ImageFrame() {
        // 设置窗体属性
        setSize(frameSize);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setIconImage(imageIcon.getImage());
        setUndecorated(true);
    }

    public void addImageByJLable() {
        setLayout(null);

        // 设置背景
        JLabel lbBg = new JLabel(imageIcon);
        lbBg.setBounds(0, 0, frameSize.width, frameSize.height);
        this.getContentPane().add(lbBg);

        addComponents();

        setVisible(true);
    }

    public void addImageByRepaint() {
        ImagePanel imagePanel = new ImagePanel(frameSize, imageIcon.getImage());
        setContentPane(imagePanel);

        addComponents();
        setVisible(true);
    }

    private void addComponents() {
        JButton btn1 = new JButton("haha");
        btn1.setBounds(10, 20, 60, 30);
        this.getContentPane().add(btn1);

        JTextField jtf = new JTextField("22222222222");
        jtf.setBounds(200, 100, 80, 30);
        this.getContentPane().add(jtf);

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ImageFrame imageFrame = new ImageFrame();
        // imageFrame.addImageByJLable();
        imageFrame.addImageByRepaint();
    }

}

运行效果如下:

图1 使用JLabel加载图片效果

图1可见,使用JLabel时,由于未图片尺寸与窗体尺寸不一致,导致图片只显示出一部分;且有一个控件被遮挡了。注意:通过精细设置尺寸和添加控件顺序,可以达到较为满意的效果的。

 

图2 使用重绘方式加载图片

图2可见,不需要可以设置匹配尺寸和控件的添加顺序,即可得到比较满意的效果。

转载于:https://www.cnblogs.com/pzy4447/p/5995145.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
还在为基于C/S模式,使用GUI的Swing组件开发的界面排版烦恼吗,快使用可视化图形界面吧,至少各个组件的位置可以通过直接拖拽来设置,字体,大小位置,颜色等属性可以直接在界面上操作,而不用再通过写代码控制,这样设计出的界面既美观又节省了很多时间!但是不是所有版本的myEclipse软件都带有Swing组件可视化图形界面功能的,myeclipse7.0只能使用一次,myeclpse8.0也需要安装插件才可以使用。下面的就介绍一下在myeclipse8.0上安装可视化图形界面的具体步骤。(这是通过本人验证过的,如下是一步步截图说明的!据说此方法也适合myeclipse6.5,我试过,不知是什么原因,但没成功.。) myEclipse8.0添加可视化图形界面插件的方法说明: 在myEclipse8.0安装目录下的:如C:\Program Files\Genuitec\Pulse Explorer\plugins 文件里,将下载的插件包net.sf.fjep.fatjar_0.0.31.jar拷贝进该文件夹,然后再删除C:\Program Files\Genuitec\Pulse Explorer\configuration目录下除了config.ini文件外的其他文件,最后再重启电脑即可在myEclipse里使用可视化图形界面工具即Swing组件。 1.现在新建一个类(new->Other…),会在出现的如下的界面中选择MyEclipse目录下的Swing 子目录下的Matisse Form,当然,只有你插件安装成功了才会有Swing这个子目录,不安装可视化图形界面插件的话是不会有这个子目录的! 2.按如上操作点击Matisse Form会进入如下界面:输入Name:如Example ,再选择你需要的容器类型,如JFrame。然后点击Finish。 3. 你会看到包下面会生成2个文件:一个是我们新建的类Example.java ,另一个就是可视化的操作界面Example.form。 打开Example.form,注意这两个文件不可以同时打开的,你在Example.form中对界面组件的设置,在Example.java中会有相应代码自动生成!如图,你可以尽情的根据自己的需要对界面进行设计! 你可以在myeclipse中的菜单栏里打开以下3个常用工具栏:Outline ,Matisse Palette及Propertise (Window->Show view->选择上面的那3个窗口)。在Outline中,你可以看到你在这个页面上所添加窗体,容器,组件等具体结构,你也可以在这上面对页面上的组件进行增删改!Matisse Palette里主要提供了供选择的窗体,容器,组件等,你可以选中你想要的组件然后在form里点击一下,然后拖拽设置你想要的大小和想置的位置!选中组件直接按delete键就可以将选中的组件删除!在Propertise里你可以设置组件的一些属性,如背景颜色,字体大小,颜色,给组件添加图片等。 更多你自己去试试吧! 4.这个可视化图形界面是非常人性化的,如果你想看一下运行后会是什么效果,不必真去运行一下,只要点击form文件里的工具栏上的第三个按钮:预览 ,即可预览运行后的效果,如下图所示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值