`
noble510520
  • 浏览: 56927 次
  • 性别: 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>
分享到:
评论

相关推荐

    图像颜色填充器

    如果相邻像素与选色足够接近(根据某个阈值设定),则会被填充为新颜色。这种技术称为“连通组件标记”或“区域生长”。 在实际实现中,可能有两种常见的填充方法:4-连接和8-连接。4-连接仅考虑上下左右四个方向...

    matlab图像专题:96 对灰度图像进行填充.zip

    图像填充通常指的是将图像中的特定区域或对象内部填充为特定的灰度值,这在图像分割、轮廓追踪和对象识别等任务中很有用。在MATLAB中,可以使用二值化、区域生长、连通组件标记等方法进行填充。 4. **二值化与填充...

    matlab图像专题:95 对二值图像进行填充.zip

    `imfill`函数用于填充连通组件,它可以将指定的边界内的所有像素设为白色,从而创建出填充的效果。有两种常见的用法: - 填充所有连通组件: ```matlab filledImage = imfill(bw, 'holes'); ``` - 填充特定...

    矩阵填充算法_路径填充算法_matlab_矩阵填充_填充matlab_填充_

    这个过程对于创建图像掩模、进行图像分割或标记特定区域非常有用。 路径填充算法是实现矩阵填充的一种方法。在MATLAB中,可以使用`find`函数来找到满足特定条件的矩阵元素,这些元素通常构成了填充的边界。`find`...

    填充pdf模板源码和jar包

    3. 创建填充对象:使用`PdfStamper`或`PdfCopyFields`类,这两个类都提供了填充表单域的功能。 4. 填充数据:通过`AcroFields`接口,你可以获取到PDF中的表单域,并设置其值。例如,`acroFields.setField("field...

    数字图像局部区域填充.docx

    在这个过程中,通常使用特定的算法,比如种子填充算法,来实现对目标区域的连通组件填充。 在MATLAB环境下,实现数字图像局部区域填充主要依靠`roifill`函数。`roifill`允许用户通过鼠标选择一个起始点或种子点,...

    matlab图像技术:25 matlab对灰度、二值图像进行填充和高频强调滤波、真彩色图像滤波案例.zip

    - **图像填充**:在图像中,填充通常指的是将某些区域的像素值设置为特定值。MATLAB提供了`imfill`函数,用于填充图像中的连通组件,例如填充孔洞或连接断开的边界。 - **滤波**:图像滤波常用于平滑噪声或增强...

    e语言-易语言创建GDI图像

    在易语言中,创建GDI(Graphics Device Interface)图像是一项基础且重要的任务,它涉及到图形绘制、图像处理等领域。GDI是Windows操作系统中的一个核心组件,允许应用程序与系统进行图形交互,包括屏幕输出、打印等...

    空洞填充Python实现

    在图像处理领域,空洞填充是一项重要的操作,它通常用于消除图像内部的白色或透明区域,使得...通过理解空洞填充的原理,结合Python和OpenCV的特性,我们可以创建自己的解决方案,以满足在不同场景下的图像处理需求。

    利用iTextSharp组件创建、操作PDF

    下面我们将深入探讨如何利用iTextSharp组件来创建和操作PDF。 首先,要开始使用iTextSharp,你需要在你的项目中引入这个库。你可以通过NuGet包管理器安装,或者直接下载源代码并将其引用到你的项目中。安装完成后,...

    C# WinForm 图片颜色填充

    这个功能允许用户通过鼠标交互,选择图像中的特定区域并为其填充颜色。我们将会介绍关键的编程概念和技术,包括图形处理、事件处理和用户界面设计。 首先,我们需要理解C# WinForm的基础。WinForm是.NET Framework...

    种子填充算法-深度优先搜索

    在实际应用中,种子填充算法不仅限于颜色填充,还可用于图像分割、连通组件分析等场景。结合深度优先搜索,可以有效地处理复杂图形,同时保持代码的可读性和效率。 总结起来,种子填充算法通过深度优先搜索实现,...

    python实现边标志填充算法.zip

    它基于连通组件的概念,从用户指定的边界点开始,沿着像素的邻接关系填充颜色,直到达到边界为止。这种算法在图形编辑软件、游戏以及数据分析可视化等领域都有广泛的应用。 在Python中实现边标志填充算法,通常会...

    Android移动应用开发中文本、按钮与图像框组件单元主要内容.pdf

    在Android移动应用开发中,构建用户界面是至关重要的一步,其中文本、按钮和图像框是基本的组件元素,用于创建用户友好的交互界面。本文将深入探讨这些组件以及如何使用它们。 1. TextView: TextView是Android中最...

    Delphi TDBImage数据感知组件

    例如,你可以创建一个TTable组件,打开数据库表,然后设置TDBImage的DataSource属性为TTable的DataSource属性,Field属性设置为存储图像数据的字段名。这样,当TTable的数据发生变化时,TDBImage会自动更新图像。 ...

    数字图像处理命令大全.doc

    `bwfill(BW1, c, r, n)` 可以填充连通组件,`bwfill(BW1, 'holes', n)` 填充图像中的孔洞。这对预处理和分割图像非常有用。 8. `bwlabel`: 它用于标记二进制图像中已连接的部分。`bwlabel` 返回一个整数矩阵,其中...

    matlab图像处理函数汇总.doc

    在示例中,`bwfill`被用来填充孔洞,使图像更加连续。 8. `bwlabel`: 这个函数对二进制图像中的连通组件进行标记,返回一个标签矩阵`L`,表示每个连通组件的唯一标识。此外,它还可以返回连通组件的数量`num`,这...

    Labview_图像处理配PDF,labview图像处理教程

    形态学操作则主要用于处理图像的拓扑结构,如腐蚀、膨胀、开闭运算等,它们在去除噪声、填充孔洞、分离连通组件等方面非常有用。 最后,教程可能会介绍一些实际应用案例,比如条形码识别、缺陷检测、目标定位等,...

    MATLAB GUI图像处理界面设计

    首先,MATLAB GUI的创建基于GUIDE(GUI Development Environment),这是一个集成的开发环境,用于设计和实现具有按钮、文本框、滑块等组件的图形界面。"gui.fig"文件是GUI的布局文件,它定义了界面元素的位置、大小...

    CAD填充插件

    2. **自定义图案**:用户可以创建自己的填充图案,导入图像或者基于现有图案进行修改,实现个性化设计。 3. **操作简便**:优化的界面和操作流程使得填充和编辑图案更为便捷,提高工作效率。 4. **精确控制**:...

Global site tag (gtag.js) - Google Analytics