gpt4 book ai didi

java - 为什么 JFrame 输出与其 .paint 方法不同,以及如何解决这个问题?

转载 作者:行者123 更新时间:2023-11-30 02:21:58 24 4
gpt4 key购买 nike

我正在尝试建立一个使用 Swing 呈现快速项目列表的系统,因为它的布局管理器非常适合我的情况。然而,在尝试使用文本换行时,我发现演示 JFrame 中显示的结果与我通过调用 .print/.paint(All) 获得的结果不同。

这是一个最小、完整且可验证的示例:

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

public class TextWrapTest {

public static void main( String[] args ) throws IOException {
final JPanel panel = new JPanel( new GridBagLayout() );
final GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 0;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;

panel.add( new JLabel( "<html>This is a piece of text." ), gbc );
gbc.gridy++;
panel.add( new JLabel( "<html>This is a very long piece of text that needs to be wrapped in order to fit in the frame." ), gbc );
gbc.gridy++;
panel.add( new JLabel( "<html>Another piece of text." ), gbc );

// Output the frame
final JFrame frame = new JFrame();
frame.setUndecorated( true );
frame.setSize( 200, 200 );
frame.add( panel );

frame.setVisible( true );

// Output the image
final BufferedImage image = new BufferedImage( frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB );
frame.paintAll( image.getGraphics() );
ImageIO.write( image, "png", new File( "output.png" ) );
}

}

JFrame:/image/zbTPz.png
输出.png:/image/OcM4x.png

如您所见,结果明显不同,并且使用 .getGraphics() 绘制时文本拒绝换行

我一直在尝试使用 GridBagConstraints,甚至尝试使用 JTextArea 进行文本换行,但没有成功。

在这件事上的任何帮助将不胜感激,因为我不知道如何让绘画方法服从文本换行。

此致,
伦斯·里克林克

最佳答案

造成这种情况的原因可能有很多,但是,我建议避免使用 paintpaintAll,因为它们会调用 API 的双缓冲方面并可能导致延迟在图像实际绘制到 Graphics 上下文之前。相反,我建议使用 printAll 因为它会在绘画时禁用双缓冲。

另一个问题可能是框架可能尚未在屏幕上实现(或者甚至没有完全绘制)。调用 setVisible 会调用大量后台工作,并将调用 EDT 回调以启动绘制过程。在这种情况下,我建议在 UI 可见后使用 SwingUtilities.invokeLater block 。

这将做一些事情,首先,我可以在框架创建的所有事件之后将任务放在事件队列中,但是,更重要的是,它将同步绘画,所以你不会与 EDT 作斗争尝试同时在屏幕上绘画

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final BufferedImage image = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
frame.paintAll(g2d);
g2d.dispose();
ImageIO.write(image, "png", new File("output.png"));
}
});

关于java - 为什么 JFrame 输出与其 .paint 方法不同,以及如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580023/

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