前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >创建被图像填充的组件解释几处做法解释几点

创建被图像填充的组件解释几处做法解释几点

作者头像
用户1174983
发布2018-02-05 14:18:28
1.2K0
发布2018-02-05 14:18:28
举报
文章被收录于专栏:钟绍威的专栏钟绍威的专栏

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

DIY的JPanel

下面用代码说话

代码语言:javascript
复制
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个尺寸呢?

代码语言:javascript
复制
    setSize(dimension);
    setPreferredSize(dimension);
    setMinimumSize(dimension);
    setMaximumSize(dimension);

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

如何进行图像缩放

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

代码语言:javascript
复制
    //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是这样解释的

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

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

DIY的JLable

下面还是用代码说话

代码语言:javascript
复制
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

下面仍然是用代码说话

代码语言:javascript
复制
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)可以设置

代码语言:javascript
复制
setMargin(new Insets(0,1,2,3));

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

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

代码语言:javascript
复制
setMargin(null);

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

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

代码语言:javascript
复制
setMargin(new Insets(0,0,0,0));

二、setIcon远远不够

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

下面是结果

这里写图片描述
这里写图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DIY的JPanel
    • 解释几处做法
      • 一、为什么这里设置了4个尺寸呢?
      • 如何进行图像缩放
  • DIY的JLable
  • DIY的JButton
    • 解释几点
      • 一、边空是什么呢?
      • 二、setIcon远远不够
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档