面板放进标签java代码_java – 如何使此面板缩放到面板中间?

所以,基本的想法是,当您更改比例,而不是允许从宽度/高度添加/减去整个更改时,您需要在位置和大小之间划分…

public void mouseWheelMoved(MouseWheelEvent e) {

int notches = e.getWheelRotation();

// Get the current/old size...

double oldWidth = image.getWidth() * scaleFactor;

double oldHeight = image.getHeight() * scaleFactor;

scaleFactor = scaleFactor + notches / 10.0;

if (scaleFactor < 0.5) {

scaleFactor = 0.5;

} else if (scaleFactor > 3.0) {

scaleFactor = 3.0;

}

// Get the new size

double newWidth = image.getWidth() * scaleFactor;

double newHeight = image.getHeight() * scaleFactor;

// Calculate the difference (and divide it by 2)

double difWidth = (oldWidth - newWidth) / 2;

double difHeight = (oldHeight - newHeight) / 2;

// Add it to the image position...

imageX += difWidth;

imageY += difHeight;

revalidate();

repaint();

}

更新了工作示例

好的,所以基本的想法是你正在处理图像所在的虚拟空间.此虚拟空间具有大小(组件大小x比例因子).这允许您将虚拟空间置于实际空间内.

之后,您只需计算虚拟空间(在真实空间内)的x / y偏移量和图像的虚拟位置.

在这个例子中,我删除了AffineTransformation #setLocation以支持生成图像的缩放实例,它只是更容易放置图像.

import java.awt.*;

import javax.imageio.ImageIO;

import javax.swing.*;

import java.awt.event.*;

import java.awt.geom.*;

import java.awt.image.BufferedImage;

import java.net.URL;

public class MoveImageExample extends JFrame {

ShowCanvas canvas;

public MoveImageExample() throws Exception {

super();

Container container = getContentPane();

canvas = new ShowCanvas(

"http://cdn.smosh.com/sites/default/files/bloguploads/funny-iphone-5-bruce-lee.jpg");

container.add(canvas);

pack();

setVisible(true);

}

public static void main(String arg[]) throws Exception {

new MoveImageExample();

}

}

@SuppressWarnings("serial")

final class ShowCanvas extends JPanel {

int imageX = 0, imageY = 0;

int lastMouseX = 0, lastMouseY = 0;

int centerX = 225;

int centerY = 225;

int canvasWidth = 450;

int canvasHeight = 450;

double scaleFactor = 1.0;

boolean firstMouseDrag = true;

BufferedImage image;

private BufferedImage scaled;

public ShowCanvas(String imagePath) throws Exception {

setBackground(Color.white);

MouseMotionHandler mouseHandler = new MouseMotionHandler();

addMouseMotionListener(mouseHandler);

addMouseListener(mouseHandler);

addMouseWheelListener(mouseHandler);

URL url = new URL(imagePath);

Image rawImage = ImageIO.read(url);

image = new BufferedImage(rawImage.getWidth(this),

rawImage.getHeight(this), BufferedImage.TYPE_INT_ARGB);

setSize(image.getWidth(), image.getHeight());

Graphics2D g2 = image.createGraphics();

g2.drawImage(rawImage, imageX, imageY, this);

}

@Override

public Dimension getPreferredSize() {

return new Dimension((int) (image.getWidth()), (int) (image.getHeight()));

}

protected BufferedImage getScaledInstance() {

if (scaled == null) {

int width = (int) (image.getWidth() * scaleFactor);

int height = (int) (image.getHeight() * scaleFactor);

scaled = new BufferedImage(width, height, image.getType());

Graphics2D g2d = scaled.createGraphics();

AffineTransform transformer = new AffineTransform();

transformer.scale(scaleFactor, scaleFactor); // scale by 2x on x and y

g2d.setTransform(transformer);

g2d.drawImage(image, 0, 0, this);

g2d.dispose();

}

return scaled;

}

public Dimension getVirtualSize() {

return new Dimension(

(int)(getWidth() * scaleFactor),

(int)(getHeight() * scaleFactor));

}

public Point getVirtualPoint(int x, int y) {

return new Point(

(int)(x * scaleFactor),

(int)(y * scaleFactor));

}

public void paintComponent(Graphics g) {

super.paintComponent(g);

Dimension vitualSize = getVirtualSize();

int xOffset = (getWidth() - vitualSize.width) / 2;

int yOffset = (getHeight() - vitualSize.height) / 2;

Graphics2D g2D = (Graphics2D) g.create();

g2D.setColor(Color.gray);

g.fillRect(0, 0, image.getWidth(), image.getHeight());

g2D.setColor(Color.GREEN);

g2D.drawRect(xOffset, yOffset, vitualSize.width, vitualSize.height);

g2D.setColor(Color.RED);

g2D.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());

g2D.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);

Point virtualPoint = getVirtualPoint(imageX, imageY);

System.out.println(virtualPoint);

g2D.drawImage(getScaledInstance(), virtualPoint.x + xOffset, virtualPoint.y + yOffset, this);

g2D.dispose();

}

class MouseMotionHandler extends MouseMotionAdapter implements

MouseListener, MouseWheelListener {

public void mousePressed(MouseEvent e) {

lastMouseX = e.getX();

lastMouseY = e.getY();

}

public void mouseDragged(MouseEvent e) {

int xDiff = e.getX() - lastMouseX;

int yDiff = e.getY() - lastMouseY;

imageX = imageX + xDiff;

imageY = imageY + yDiff;

lastMouseX = e.getX();

lastMouseY = e.getY();

repaint();

}

public void mouseWheelMoved(MouseWheelEvent e) {

scaled = null;

int notches = e.getWheelRotation();

scaleFactor = scaleFactor + notches / 10.0;

if (scaleFactor < 0.5) {

scaleFactor = 0.5;

} else if (scaleFactor > 3.0) {

scaleFactor = 3.0;

}

repaint();

}

public void mouseReleased(MouseEvent e) {

}

public void mouseEntered(MouseEvent e) {

}

public void mouseExited(MouseEvent e) {

}

public void mouseClicked(MouseEvent e) {

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值