如何通过Java动态调整绘图区域的大小?
我试图在不丢失图像上绘制的图形的情况下调整我的BuffereImage(我的绘图区域)的大小,并在调整大小后继续绘制。(如在Paint.NET)我使用JSplitPane从边缘执行此操作,但当我想继续绘制时,光标(笔)距离绘制的图形约3厘米(形状)因为图形随着图像的增长而增长。当我删除整个图片时,效果会更好。和 我在Google和StackoverFlow中查看了答案,但我觉得这不管用。我怎样才能解决这个问题 到目前为止,我是这样尝试的: 类用户界面如何通过Java动态调整绘图区域的大小?,java,graphics,bufferedimage,Java,Graphics,Bufferedimage,我试图在不丢失图像上绘制的图形的情况下调整我的BuffereImage(我的绘图区域)的大小,并在调整大小后继续绘制。(如在Paint.NET)我使用JSplitPane从边缘执行此操作,但当我想继续绘制时,光标(笔)距离绘制的图形约3厘米(形状)因为图形随着图像的增长而增长。当我删除整个图片时,效果会更好。和 我在Google和StackoverFlow中查看了答案,但我觉得这不管用。我怎样才能解决这个问题 到目前为止,我是这样尝试的: 类用户界面 jSplitPane.addProperty
jSplitPane.addPropertyChangeListener(jSplitPane.DIVIDER\u LOCATION\u属性,(PropertyChangeEvent evt)->{
double-imageHeight=jSplitPane.getDividerLocation();
双图像宽度=图像高度*1.6;
top.setDividerLocation((int)图像宽度);
drawGround.changeImageSizeDynmcally((int)imageWidth,(int)imageHeight);
重新粉刷();
});
班级休息室
BufferedImage masterImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
//image is master image drawing at first time.
public void changeImageSizeDynmcally(int w, int h) {
AREA_WIDTH = w;
AREA_HEIGHT = h;
repaint();
BufferedImage scaledImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2D = scaledImage.createGraphics();
g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2D.drawImage(masterImage, 0, 0, null);
g2D.dispose();
}
用这种方法之后,我有
`@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (masterImage != null) {
g2D = (Graphics2D) masterImage.getGraphics();
g2D.setComposite(AlphaComposite.Src);
bla,bla,bla`
我通过创建新的图像设置方法解决了这个问题:
public void changeImageSizeDynmcally(int x, int y) {
AREA_WIDTH = x;
AREA_HEIGHT = y;
repaint();
scaledImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2D = scaledImage.createGraphics();
g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2D.drawImage(image,0,0, null);
g2D.dispose();
setImage(scaledImage); //this is a new method!
}`
新方法是:
public void setImage(BufferedImage img){
如果(img!=null){
g2D=(Graphics2D)img.getGraphics();
g2D.setComposite(AlphaComposite.Src);
g2D.setRenderingHint(RenderingHints.KEY\u COLOR\u RENDERING,RenderingHints.VALUE\u COLOR\u RENDER\u QUALITY);
g2D.setRenderingHint(renderingHits.KEY_RENDERING,renderingHits.VALUE_RENDER_QUALITY);
g2D.setRenderingHint(renderingHits.KEY\u STROKE\u控件,renderingHits.VALUE\u STROKE\u PURE);
g2D.setRenderingHint(renderingHits.KEY\u抗锯齿,renderingHits.VALUE\u抗锯齿\u开启);
g2D.setRenderingHint(renderingHits.KEY\u TEXT\u ANTIALIAS,renderingHits.VALUE\u TEXT\u ANTIALIAS\u LCD\u HRGB);
masterImage=img;
重新油漆();
}
}
它的工作原理类似于将新图像分配给旧图像。制作一个新的
缓冲图像
,按照您想要的大小绘制原始缓冲图像
(即图形#绘图图像
),将新的buffereImage
指定给旧的图像…您从未将scaleImage
指定给任何对象,因此masterImage
(现在是旧图像)仍然是used@MadProgrammer感谢您的回答,您是对的,现在我将尝试通知u.@MadProgrammer使用新的缩放图像更改主图像,我需要创建返回BuffereImage的新方法。因为在我的方法中它是直接绘制的。为什么不将scaleImage
分配给masterImage
(并触发重新绘制).masterImage=scaledImage;