gpt4 book ai didi

java - JScrollPane内容转图片

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:08 26 4
gpt4 key购买 nike

我正在尝试将 JScrollPane(大于屏幕)的主视口(viewport)和标题保存到 PNG 图像文件中。我创建了 3 个扩展 JPanel 的类(MainTablePanel、MapsHeaderPanel 和 ItemsHeaderPanel)并将它们设置为视口(viewport)。他们每个人都有这个方法:

public BufferedImage createImage() {
BufferedImage bi = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
paint(g);
g.dispose();
return bi;
}

每个类还有一个 paint 方法,它绘制背景,然后调用 super.paint() 绘制一些标签。例如:

public void paint(Graphics g){
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(new Color(255, 255, 0, 50));
// for loop that paints some vertical yellow lines
for(int i=0; i<getWidth(); i+=K.mW){
g.fillRect(i-1, 0, 2, getHeight());
if(i%(K.mW*5)==0){
g.fillRect(i-2, 0, 4, getHeight());
}
}
// called to pain some rotated JLabels
super.paint(g);
}

然后我尝试使用以下代码从外部 JFrame 将它们保存到 PNG 文件:

BufferedImage tableImg = mainTableP.createImage();
BufferedImage topImg = mapsHeaderP.createImage();
BufferedImage leftImg = itemsHeaderP.createImage();

ImageIO.write(tableImg, "png", new File(s.homeDir+"/table.png"));
ImageIO.write(topImg, "png", new File(s.homeDir+"/top.png"));
ImageIO.write(leftImg, "png", new File(s.homeDir+"/left.png"));

这是应用程序运行的屏幕截图:screenshot

这是导出的 header :top

如果我注释“super.paint(g)”指令,我将获得正确的图像(因此显然没有所有 JLable)。似乎第二次绘制(super.paint(g))被绘制转移到 BufferedImage 中并在其 JPanel 之外获取元素。有人可以向我解释这种行为吗?谢谢。

========== 编辑 SSCCE ================================== ==

这应该编译。你可以按原样执行,在 c:\中你会发现两个图像(top.png 和 left.png)应该与两个标题相同。不幸的是,他们不是。背景没有画。此外(特别是如果您查看 left.png)您可以看到标签被绘制了两次并移动了(请注意,例如,“Left test 21”)。

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Main {

public static void main(String[] args) {

JFrame frame = new JFrame();
frame.setLayout(null);
frame.setSize(800, 600);

JScrollPane scrollP = new JScrollPane();
scrollP.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollP.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

MyPanel top = new MyPanel();
for(int i=0; i<30; i++){
JLabel label = new JLabel("Test "+i);
label.setOpaque(false);
label.setBounds(50*i, 40, 50, 20);
label.setForeground(Color.GREEN);
top.add(label);
}
top.setLayout(null);
top.setOpaque(false);
top.setPreferredSize(new Dimension(50*30, 200));
top.validate();

MyPanel left = new MyPanel();
for(int i=0; i<30; i++){
JLabel label = new JLabel("Left test "+i);
label.setBounds(0, 50*i, 100, 20);
label.setForeground(Color.RED);
left.add(label);
}
left.setLayout(null);
left.setOpaque(false);
left.setPreferredSize(new Dimension(200, 50*30));

MyPanel center = new MyPanel();
center.setLayout(null);
center.setOpaque(false);
center.setPreferredSize(new Dimension(50*30, 50*30));

scrollP.setViewportView(center);
scrollP.setColumnHeaderView(top);
scrollP.setRowHeaderView(left);

scrollP.setBounds(0, 50, 750, 500);
frame.add(scrollP);

frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);

try{
BufferedImage topImg = top.createImage();
ImageIO.write(topImg, "png", new File("C:/top.png"));

BufferedImage leftImg = left.createImage();
ImageIO.write(leftImg, "png", new File("C:/left.png"));
}catch(Exception e){
e.printStackTrace();
}
}


}

class MyPanel extends JPanel{
public void paint(Graphics g){
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(new Color(255, 255, 0, 50));
for(int i=0; i<getWidth(); i+=50){
g.fillRect(i-1, 0, 2, getHeight());
}
super.paint(g); // COMMENT this line to obtain background images
}

public BufferedImage createImage() {
BufferedImage bi = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
paint(g);
g.dispose();
return bi;
}
}

最佳答案

我无法重现任何异常行为,但我猜你忘记了移动图像绘制原点 (g.translate()) 以符合你的期望。此外,为了安全起见,请勿使用图像类型 ARGB。使用图像类型 RGB。您的特定 Java 实现完全有可能是罪魁祸首。实现没有约定只能在子组件上调用一次绘制。

关于java - JScrollPane内容转图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13858599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com