如何通过Java动态调整绘图区域?
How to resize drawing area dynamically via Java?
我正在尝试调整 BufferedImage(我的绘图区域)的大小而不丢失图像上绘制的图形,并在调整大小后继续绘制.(就像在 Paint.NET 中一样)我正在从边缘使用 JSplitPane 执行此操作并且它正在发生但是当我想继续绘制时,光标(笔)一直在距离绘制的图形(形状)3 厘米,因为图形随图像增长。当我删除整个图片时,它会变得更好。 and
我查看了 Google 和 Whosebug 中的答案,但它不适用于 me.How 我可以解决这个问题吗?
到目前为止我是这样尝试的:
Class UI
jSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, (PropertyChangeEvent evt) -> {
double imageHeight = jSplitPane.getDividerLocation();
double imageWidth = imageHeight * 1.6;
top.setDividerLocation((int) imageWidth);
drawGround.changeImageSizeDynmcally((int) imageWidth, (int) imageHeight);
drawGround.repaint();
});
Class DrawGround
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) {
if (img != null) {
g2D = (Graphics2D) img.getGraphics();
g2D.setComposite(AlphaComposite.Src);
g2D.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2D.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
masterImage = img;
repaint();
}
}
就像将新图像分配给旧图像一样工作。
我正在尝试调整 BufferedImage(我的绘图区域)的大小而不丢失图像上绘制的图形,并在调整大小后继续绘制.(就像在 Paint.NET 中一样)我正在从边缘使用 JSplitPane 执行此操作并且它正在发生但是当我想继续绘制时,光标(笔)一直在距离绘制的图形(形状)3 厘米,因为图形随图像增长。当我删除整个图片时,它会变得更好。
我查看了 Google 和 Whosebug 中的答案,但它不适用于 me.How 我可以解决这个问题吗?
到目前为止我是这样尝试的:
Class UI
jSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, (PropertyChangeEvent evt) -> {
double imageHeight = jSplitPane.getDividerLocation();
double imageWidth = imageHeight * 1.6;
top.setDividerLocation((int) imageWidth);
drawGround.changeImageSizeDynmcally((int) imageWidth, (int) imageHeight);
drawGround.repaint();
});
Class DrawGround
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) {
if (img != null) {
g2D = (Graphics2D) img.getGraphics();
g2D.setComposite(AlphaComposite.Src);
g2D.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2D.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
masterImage = img;
repaint();
}
}
就像将新图像分配给旧图像一样工作。