如果你直接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));
setSize(dimension);
setPreferredSize(dimension);
setMinimumSize(dimension);
setMaximumSize(dimension);
}
public void paintComponent(Graphics g){
g.drawImage(image,0,0,(int)(dimension.getWidth()*0.5),(int)(dimension.getHeight()*0.5),null);
}
}
class Demo{
public static void main(String[] args){
ImagePanel panel=new ImagePanel(new ImageIcon("D:\\微信截图_20151227195429.png").getImage());
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,(int)(dimension.getWidth()*0.5),(int)(dimension.getHeight()*0.5),null);
这里就要说说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));
setText(null);
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中,可以使用二值化、区域生长、连通组件标记等方法进行填充。 4. **二值化与填充...
`imfill`函数用于填充连通组件,它可以将指定的边界内的所有像素设为白色,从而创建出填充的效果。有两种常见的用法: - 填充所有连通组件: ```matlab filledImage = imfill(bw, 'holes'); ``` - 填充特定...
这个过程对于创建图像掩模、进行图像分割或标记特定区域非常有用。 路径填充算法是实现矩阵填充的一种方法。在MATLAB中,可以使用`find`函数来找到满足特定条件的矩阵元素,这些元素通常构成了填充的边界。`find`...
3. 创建填充对象:使用`PdfStamper`或`PdfCopyFields`类,这两个类都提供了填充表单域的功能。 4. 填充数据:通过`AcroFields`接口,你可以获取到PDF中的表单域,并设置其值。例如,`acroFields.setField("field...
在这个过程中,通常使用特定的算法,比如种子填充算法,来实现对目标区域的连通组件填充。 在MATLAB环境下,实现数字图像局部区域填充主要依靠`roifill`函数。`roifill`允许用户通过鼠标选择一个起始点或种子点,...
- **图像填充**:在图像中,填充通常指的是将某些区域的像素值设置为特定值。MATLAB提供了`imfill`函数,用于填充图像中的连通组件,例如填充孔洞或连接断开的边界。 - **滤波**:图像滤波常用于平滑噪声或增强...
在易语言中,创建GDI(Graphics Device Interface)图像是一项基础且重要的任务,它涉及到图形绘制、图像处理等领域。GDI是Windows操作系统中的一个核心组件,允许应用程序与系统进行图形交互,包括屏幕输出、打印等...
在图像处理领域,空洞填充是一项重要的操作,它通常用于消除图像内部的白色或透明区域,使得...通过理解空洞填充的原理,结合Python和OpenCV的特性,我们可以创建自己的解决方案,以满足在不同场景下的图像处理需求。
下面我们将深入探讨如何利用iTextSharp组件来创建和操作PDF。 首先,要开始使用iTextSharp,你需要在你的项目中引入这个库。你可以通过NuGet包管理器安装,或者直接下载源代码并将其引用到你的项目中。安装完成后,...
这个功能允许用户通过鼠标交互,选择图像中的特定区域并为其填充颜色。我们将会介绍关键的编程概念和技术,包括图形处理、事件处理和用户界面设计。 首先,我们需要理解C# WinForm的基础。WinForm是.NET Framework...
在实际应用中,种子填充算法不仅限于颜色填充,还可用于图像分割、连通组件分析等场景。结合深度优先搜索,可以有效地处理复杂图形,同时保持代码的可读性和效率。 总结起来,种子填充算法通过深度优先搜索实现,...
它基于连通组件的概念,从用户指定的边界点开始,沿着像素的邻接关系填充颜色,直到达到边界为止。这种算法在图形编辑软件、游戏以及数据分析可视化等领域都有广泛的应用。 在Python中实现边标志填充算法,通常会...
在Android移动应用开发中,构建用户界面是至关重要的一步,其中文本、按钮和图像框是基本的组件元素,用于创建用户友好的交互界面。本文将深入探讨这些组件以及如何使用它们。 1. TextView: TextView是Android中最...
例如,你可以创建一个TTable组件,打开数据库表,然后设置TDBImage的DataSource属性为TTable的DataSource属性,Field属性设置为存储图像数据的字段名。这样,当TTable的数据发生变化时,TDBImage会自动更新图像。 ...
`bwfill(BW1, c, r, n)` 可以填充连通组件,`bwfill(BW1, 'holes', n)` 填充图像中的孔洞。这对预处理和分割图像非常有用。 8. `bwlabel`: 它用于标记二进制图像中已连接的部分。`bwlabel` 返回一个整数矩阵,其中...
在示例中,`bwfill`被用来填充孔洞,使图像更加连续。 8. `bwlabel`: 这个函数对二进制图像中的连通组件进行标记,返回一个标签矩阵`L`,表示每个连通组件的唯一标识。此外,它还可以返回连通组件的数量`num`,这...
形态学操作则主要用于处理图像的拓扑结构,如腐蚀、膨胀、开闭运算等,它们在去除噪声、填充孔洞、分离连通组件等方面非常有用。 最后,教程可能会介绍一些实际应用案例,比如条形码识别、缺陷检测、目标定位等,...
首先,MATLAB GUI的创建基于GUIDE(GUI Development Environment),这是一个集成的开发环境,用于设计和实现具有按钮、文本框、滑块等组件的图形界面。"gui.fig"文件是GUI的布局文件,它定义了界面元素的位置、大小...
2. **自定义图案**:用户可以创建自己的填充图案,导入图像或者基于现有图案进行修改,实现个性化设计。 3. **操作简便**:优化的界面和操作流程使得填充和编辑图案更为便捷,提高工作效率。 4. **精确控制**:...