java中图片适应窗口大小,java中怎么让图片随着窗口的大小一起改变

这篇博客介绍了一个Java类`ImageComposite`,它扩展了`Composite`,支持图片在窗口中的居中、平铺和拉伸显示。通过设置不同的显示模式,可以实现背景图片随着窗口大小的变化而自动调整显示效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java codeimport java.io.InputStream;

import org.eclipse.swt.SWT;

import org.eclipse.swt.events.PaintEvent;

import org.eclipse.swt.events.PaintListener;

import org.eclipse.swt.graphics.Image;

import org.eclipse.swt.graphics.ImageData;

import org.eclipse.swt.graphics.Rectangle;

import org.eclipse.swt.layout.FillLayout;

import org.eclipse.swt.widgets.Composite;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Shell;

/**

* 可设置背景图片的Composite

* Composite本身是可以设置背景图片的,但是只提供了平铺的显示方式,该类实现了居中、平铺和拉伸三种显示方式。

*

* @author 003

*/

public class ImageComposite extends Composite

{

/**

* 居中

*/

public static final String CENTRE = "Centre";

/**

* 平铺

*/

public static final String TILED = "Tiled";

/**

* 拉伸

*/

public static final String SCALED = "Scaled";

/**

* 背景图片

*/

private Image backgroundImage;

/**

* 背景图片显示模式

*/

private String imageDisplayMode;

/**

* 背景图片显示模式索引(引入此属性有助于必要时扩展)

*/

private int modeIndex;

/**

* 构造一个没有背景图片的ImageComposite

* @param parent 父组件

* @param style 风格

*/

public ImageComposite(Composite parent, int style)

{

this(parent, style, null, CENTRE);

}

/**

* 构造一个具有指定背景图片和指定显示模式的ImageComposite

* @param parent 父组件

* @param style 风格

* @param image 背景图片

* @param modeName 背景图片显示模式

*/

public ImageComposite(Composite parent, int style, Image image, String modeName)

{

super(parent, style);

addPaintListener(new PaintListener()

{

@Override

public void paintControl(PaintEvent e)

{

drawImage(e);

}

});

setBackgroundImage(image);

setImageDisplayMode(modeName);

}

/**

* 获取背景图片

* @return 背景图片

* @see org.eclipse.swt.widgets.Control#getBackgroundImage(Image)

*/

@Override

public Image getBackgroundImage()

{

return backgroundImage;

}

/**

* 设置背景图片

* @param 背景图片

* @see org.eclipse.swt.widgets.Control#setBackgroundImage(Image)

*/

@Override

public void setBackgroundImage(Image backgroundImage)

{

this.backgroundImage = backgroundImage;

this.redraw();

}

/**

* 获取背景图片显示模式

* @return 显示模式

*/

public String getImageDisplayMode()

{

return imageDisplayMode;

}

/**

* 设置背景图片显示模式

* @param modeName 模式名称,取值仅限于ImagePane.TILED ImagePane.SCALED ImagePane.CENTRE

*/

public void setImageDisplayMode(String modeName)

{

if(modeName != null)

{

modeName = modeName.trim();

//居中

if(modeName.equalsIgnoreCase(CENTRE))

{

this.imageDisplayMode = CENTRE;

modeIndex = 0;

}

//平铺

else if(modeName.equalsIgnoreCase(TILED))

{

this.imageDisplayMode = TILED;

modeIndex = 1;

}

//拉伸

else if(modeName.equalsIgnoreCase(SCALED))

{

this.imageDisplayMode = SCALED;

modeIndex = 2;

}

this.redraw();

}

}

/**

* 绘制背景

* @param e PaintEvent

*/

private void drawImage(PaintEvent e)

{

//如果设置了背景图片则显示

if(backgroundImage != null)

{

int width = this.getSize().x;

int height = this.getSize().y;

int imageWidth = backgroundImage.getImageData().width;

int imageHeight = backgroundImage.getImageData().height;

switch(modeIndex)

{

//居中

case 0:

{

int x = (width - imageWidth) / 2;

int y = (height - imageHeight) / 2;

e.gc.drawImage(backgroundImage, x, y);

break;

}

//平铺

case 1:

{

for(int ix = 0; ix < width; ix += imageWidth)

{

for(int iy = 0; iy < height; iy += imageHeight)

{

e.gc.drawImage(backgroundImage, ix, iy);

}

}

break;

}

//拉伸

case 2:

{

ImageData data = backgroundImage.getImageData().scaledTo(width, height);

e.gc.drawImage(new Image(e.display, data), 0, 0);

break;

}

}

}

}

/**

* 设置窗口位于屏幕中间

* @param display 设备

* @param shell 要调整位置的窗口对象

*/

public static void center(Display display, Shell shell)

{

Rectangle bounds = display.getPrimaryMonitor().getBounds();

Rectangle rect = shell.getBounds();

int x = bounds.x + (bounds.width - rect.width) / 2;

int y = bounds.y + (bounds.height - rect.height) / 2;

shell.setLocation(x, y);

}

public static void main(String[] args)

{

Display display = Display.getDefault();

InputStream is = ImageComposite.class.getResourceAsStream("test.jpg");

Image image = new Image(display, new ImageData(is));

Shell shell = new Shell();

new ImageComposite(shell, SWT.NONE, image, ImageComposite.SCALED);

shell.setText("ImageComposite Test");

shell.setLayout(new FillLayout());

shell.setSize(800, 600);

center(display, shell);

shell.open();

shell.layout();

while(!shell.isDisposed())

{

if(!display.readAndDispatch())

{

display.sleep();

}

}

display.dispose();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值