`
noble510520
  • 浏览: 54266 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

创建被图像填充的组件

 
阅读更多

如果你直接new一个组件的话,组件是标准外观
如果需要改变组件的外观,最关键的就是要就需要重写组件的paintCoponent(Graphics g)方法,同时需要调整组件的大小

DIY的JPanel

下面用代码说话

import javax.swing.*;
import java.awt.*;

class ImagePanel extends JPanel{
    private Image image;//用来储存背景对象
    private Dimension dimension;//用来储存背景对象的尺寸
  public ImagePanel(Image image){
    this.image=image;
    dimension=new Dimension(image.getWidth(null),image.getHeight(null));//panel大小的对象
    setSize(dimension);
    setPreferredSize(dimension);
    setMinimumSize(dimension);
    setMaximumSize(dimension);
    //setLayout(null);
}
public void paintComponent(Graphics g){//Graphics图形类中有很多绘画方法
    //g.drawImage(image,0,0,null);//画背景,大小为原始大小
    g.drawImage(image,0,0,(int)(dimension.getWidth()*0.5),(int)(dimension.getHeight()*0.5),null);//大小缩放为原来的百分之50
}
}
class Demo{
    public static void main(String[] args){
    ImagePanel panel=new ImagePanel(new ImageIcon("D:\\微信截图_20151227195429.png").getImage());//Image对象的获取方法,Image是一个抽象类
    JFrame frame=new JFrame("haha");
    frame.getContentPane().add(panel);
    frame.pack();//加完所有组件后自动调整窗口的大小
    frame.setVisible(true);
}
}

下面是结果
这里写图片描述

用到了以下几个类
1.Graphics用来绘画图像, java.awt
2.Dimension用来设置各种大小,java.awt
3.Image用来储存背景的抽象类,java.awt
4.ImageIcon用来创建Image的实例,此类实现了Icon接口,javax.swing

解释几处做法

一、为什么这里设置了4个尺寸呢?

    setSize(dimension);
    setPreferredSize(dimension);
    setMinimumSize(dimension);
    setMaximumSize(dimension);

尺寸,偏好尺寸,最小尺寸,最大尺寸
因为并不确定要放进容器的布局
因为当布局为null也就是绝对布局的时候,只需要设置serSize就可以了
当布局不为空时,此时布局管理器会相应的调整图像的尺寸了

如何进行图像缩放

当组件的图像太大时,甚至超过了屏幕,此时就需要进行缩放了
处理的地方是

    //g.drawImage(image,0,0,null);//画背景,大小为原始大小
    g.drawImage(image,0,0,(int)(dimension.getWidth()*0.5),(int)(dimension.getHeight()*0.5),null);//大小缩放为原来的百分之50

这里就要说说Graphics类中绘制图像的方法了
drawImage(Image image,int x,int y,ImageObserver observer);
drawImage(Image image,int x,int y,int width,int height,ImageObserver observer);
第一种方法是没有进行缩放的,第二种方法进行了缩放
缩放后的大小为width*height,缩放的方法可以参照上面代码,进行等比例缩放
至于那个ImageObserver有什么用,我还不知道
API是这样解释的

此方法在任何情况下都立刻返回,甚至在要绘制的图像区域没有针对当前输出设备完成缩放、抖动或转换的情况下也是如此。如果当前的输出表示形式尚未完成,则 drawImage 返回 false。随着更多的图像可用,加载图像的进程将通知指定的图像观察者。 
observer - 当缩放并转换了更多图像时要通知的对象。 
ImageObserver用于在构造 Image 时,接收有关 Image 信息通知的异步更新接口。 

我的理解是,当设置好了背景之后,并不一定是马上在输出设备上体现出来,需要一定的时间
如果上一个设置图像还在输出的时候又设置一次图像的话,那么方法返回false,并等到上一次设置图像输出完毕了之后,通知指定的图像观察者,图像观察者就调用imageUpdate方法,更新图像

DIY的JLable

下面还是用代码说话

import java.awt.*;
import javax.swing.*;
class JLabelDemo extends JLabel{
    JLabelDemo(String image){
        this((new ImageIcon(image)).getImage());
        }
    JLabelDemo(Image image){
        setSize(image.getWidth(null),image.getHeight(null));//方便测试透明的效果
        setIcon(new ImageIcon(image));//设置图标,也就是说JLabel类自带有绘画图像的方法,不需要我们去覆写
        setText(null);//不设置Label文本内容
        setBorder(null);//不设置边框
        setIconTextGap(0);//设置图标和文本的距离
        setOpaque(false);//是否不透明
        }
    }

如果要自定义一个JLabel,有以下几步需要做的:
1.设置icon,JLabel类中有setIcon()方法,也就自然不需要我们来覆写paintComponent方法啦
2.设置Label尺寸
3.设置Label是否有边框
4.设置Label是否透明(这点很重要,直接影响效果(如果面板有背景的话))
5.设置文本内容
6.设置文本内容和图标的距离##(如果不需要文本内容的话,这时候Label可以直接当成是插入图片去用)##

下面是两种结果,分别是背景透明和背景不透明
这种是设置为不透明
这种是设置为透明

DIY的JButton

下面仍然是用代码说话

import javax.swing.*;
import java.awt.*;
class JButtonDemo extends JButton{
    JButtonDemo(String image){
        this(new ImageIcon(image),null);
        }
    JButtonDemo(String image,String text){
        this(new ImageIcon(image),text);
        }
    JButtonDemo(ImageIcon icon,String text){
        setSize(icon.getImage().getWidth(null),icon.getImage().getHeight(null));//尺寸
        setIcon(icon);//图标
        setText(text);//文本
        setIconTextGap(0);//文本与图标的距离
        setBorder(null);//边框
        setBorderPainted(false);//是否画边框
        setMargin(new Insets(0,0,0,0));//边空
        }
}

自定义Label和自定义Button的步骤差不多
只是多了边空和边框这两个属性

解释几点

一、边空是什么呢?

边空就是当图标和文本都画完了之后,图标和文本离边框还有一定距离时,就会绘画边空了,就是白边
用setMargin(Insets m)可以设置

setMargin(new Insets(0,1,2,3));

注意到实例化Insets有四个参数分别是距离上左下右边界的距离

需要注意的是:::::如果不想要边空的话

setMargin(null);

这样子做的话,是不会起效果的,反而是用了默认边空,由Border对象适当的建立边空

如果想不需要边空的话,只能这样做

setMargin(new Insets(0,0,0,0));

二、setIcon远远不够

setIcon只是设置了这个按钮的默认外观,实际开发还需要设置以下几种外观:
1.光标按下去时的外观——setPressedIcon(ImageIcon)
2.鼠标滚动外观——setRolloverIcon(ImageIcon)
3.选中外观——setSelectedIcon(ImageIcon)
…..

下面是结果
这里写图片描述

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    MATLAB图形图像处理

    4.2.1 对象创建时获取 4.2.2 层次关系来获取 4.2.3 当前对象的获取 4.2.4 根据对象属性值的获取 4.3 图形对象句柄的删除与判断 4.3.1 句柄的删除 4.3.2 句柄的判断 4.4 图形对象属性值的获取与设置 4.4.1 ...

    matlab6.5图形图像处理源程序

    4.2.1 对象创建时获取 4.2.2 层次关系来获取 4.2.3 当前对象的获取 4.2.4 根据对象属性值的获取 4.3 图形对象句柄的删除与判断 4.3.1 句柄的删除 4.3.2 句柄的判断 4.4 图形对象属性值的获取与设置 4.4.1 ...

    图形图像处理源程序-matlab6.5图形图像处理源程序.rar

    图形图像处理源程序-matlab6.5图形图像处理源程序.rar 这是一些图形图像处理源程序,需要的话可以参考一下 第一章 MATLAB6.5 基础 1.1 MATLAB 语言介绍 1.1.1 MATLAB 产品系列与应用 1.1.2 MATLAB6.5 的...

    VC++ matlab图像处理

    4.2.1 对象创建时获取 4.2.2 层次关系来获取 4.2.3 当前对象的获取 4.2.4 根据对象属性值的获取 4.3 图形对象句柄的删除与判断 4.3.1 句柄的删除 4.3.2 句柄的判断 4.4 图形对象属性值的获取与设置 4.4.1 ...

    IDL入门教程.doc

    创建填充的等值线图 49 在显示窗口定位图形输出 51 设置图形边缘 52 设置图形位置 52 设置图形区域 53 创建多个图形 53 给图形显示添加文本 57 找出可用字体的名称 58 用XYOutS命令添加文本 58 用矢量字体使用XYOut ...

    免费版 PDF Java组件_Free Spire.PDF for Java 1.1.0

    支持绘制文本,图像和形状到 PDF,从 PDF 文件中提取文本,创建和填充 PDF 表单域。 Free Spire.PDF for JAVA 支持创建 PDF/A-1 文档。 2. 高质量的 PDF 文档转换。 支持将 PDF 文档转换为 XPS,和高品质的图像文件...

    matlab6.5图形图象处理源程序

    4.2.1 对象创建时获取 4.2.2 层次关系来获取 4.2.3 当前对象的获取 4.2.4 根据对象属性值的获取 4.3 图形对象句柄的删除与判断 4.3.1 句柄的删除 4.3.2 句柄的判断 4.4 图形对象属性值的获取与设置 4.4.1 ...

    IDL帮助(中文).doc

    创建填充的等值线图 49 在显示窗口定位图形输出 51 设置图形边缘 52 设置图形位置 52 设置图形区域 53 创建多个图形 53 给图形显示添加文本 57 找出可用字体的名称 58 用XYOutS命令添加文本 58 用矢量字体使用XYOut ...

    flex3的cookbook书籍完整版dpf(包含目录)

    使用复杂XML数据来填充组件 19.10节. 从Web服务中把XML译码成为强类型对象 第二十章与浏览器通信(628) 20.1节连接到外部URL 20.2节使用FlashVars 20.3节在Flex里面调用JavaScript函数方法 20.4节在JavaScript中调用...

    EXCEL 2007 宝典 1/10

     2.4.3 创建自定义填充序列  2.4.4 编辑或删除自定义序列 2.5 数据的复制、剪切和粘贴  2.5.1 复制与粘贴  2.5.2 剪切与粘贴 2.6 自动完成与自动换行  2.6.1 打开与关闭自动完成功能  2.6.2 在单元格中自动...

    易语言纯API调用实现GDI/GDI+ 画板,还原E画板90%以上的功能-易语言

    另一种就是不透明,不透明的就是在窗口上创建一个组件,用来绘画 还有一些属性懒得去弄了,有兴趣的取弄一下属性吧 比如底图,用户设置了底图,那就把底图载入,然后选入dc中,这样就有底图了 还有画笔类型什么的....我都...

    server:图像共享应用程序的服务器组件

    创建完成后,您将使用回购维护者提供给您的秘密来填充它: .env : # MongoDB MONGO_URI=YOUR MONGO URI # AWS AWS_ACCESS_KEY_ID=YOUR AWS ACCESS KEY ID AWS_SECRET_ACCESS_KEY=YOUR AWS SECRET ACCESS KEY

    用Delphi实现Word文件的预览

    要创建自己的图像,最灵活的方法是用一个 BufferedImage 对象,它是 Image 类的一个子类,它把图像数据存储在一个可以被访问的缓冲区中。它还支持各种存储像素数据的方法:使用或不使用 alpha 通道、不同种类的颜色...

    grouper-dockerized:组基础图像

    使用这些图像,采用者可以通过创建基于这些图像的自定义图像并仅覆盖自定义的Grouper属性文件来快速启动Grouper环境。 可以在上找到执行此操作的示例。 快速开始 在下载源代码并运行docker-compose up查看这些图像...

    免费版.NET PDF组件_Free Spire.PDF for .NET 4.3

    使用该组件,程序员可以 在.NET 程序中创建、读取、写入、编辑和操作 PDF 文档。这个控件能支持的功能十分全面,例如文档安全性设置(电子签名),提取 PDF 文本、附件、图片,PDF 合并和拆分,更新 Metadata,设置 ...

    VetTopCoder:topcoder 兽医帮助应用程序的闪电组件代码

    动物是基于填充的表单元素创建的,通过单击动物的图像并在该位置指定伤害来添加伤害。兽医观察者: 这是兽医用来查看已输入系统的动物的组件。 All animals are loaded and when one is selected the details are ...

    精通MFC (光盘) 源代码

    15.4.3 实现被聚合的COM组件 15.4.4 实现包容组件 15.4.5 编译、注册COM组件 15.4.6 创建一个对话框应用 15.5 双重接口 15.5.1 调度表 15.5.2 COleDispatchImpl 15.5.3 m_xDispatch成员 15.5.4 输出...

    免费PDF控件Spire.PDF

    免费Spire.PDF for .NET 是一款由e-iceblue公司开发的专业性的PDF文档创建组件。它能够使用户在不用Adobe Acrobat和其他外部控件的情况下,运用.NET 应用程序阅读,编写和操纵PDF 文档。Spire.PDF for .NET不仅可以...

    matlab图形用户界面(GUI)制作.DOC

    使用axes命令创建一个轴位框,并将其设置为 normalized 单位,位置设置为 [0,0,1,1],使其填充整个图形窗口。 (2)生成静态文本和编辑框 使用uicontrol命令创建一个静态文本框和一个编辑框。静态文本框用于显示...

Global site tag (gtag.js) - Google Analytics