java - 使用 BufferedImage 时 Swing HTML 渲染发生变化

标签 java html image swing

包含 HTML 的标签的行为在首次绘制到 BufferedImage 时似乎发生了变化。在下面的代码中,只显示了文本的前两行。行数随着 <br> 的增加而增加添加了休息时间。它似乎是在计算预换行而不是后换行的行数。

如果标签直接绘制到组件的图形(即注释行),那么它工作正常。

如果将其绘制为 BufferedImage,为什么行为会发生变化?的图形而不是 JComponent的。

public class HTMLFormatting {

    public static void main(String[] args) {
        JFrame frame = new JFrame("HTML Formatting");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(200, 330));
        frame.setLayout(new BorderLayout());

        JPanel panel = new JPanel() {
            public void paint(Graphics g) {
                BufferedImage image = new BufferedImage(200, 300, BufferedImage.TYPE_INT_ARGB);
                JLabel label = new JLabel("<html>A piece of text that requires wrapping because "
                    + "it is too long for a single line of a label and is a test of formatting."
                    + "<br>A second line.</html>");
                label.setVerticalAlignment(JLabel.TOP);
                JPanel layoutPanel = new JPanel(new BorderLayout());
                layoutPanel.setSize(new Dimension(200, 300));
                layoutPanel.add(label, BorderLayout.NORTH);
                layoutPanel.doLayout();
                label.paint(image.getGraphics());
                g.drawImage(image, 0, 0, null);
//                label.paint(g);
            }
        };
        frame.add(panel, BorderLayout.CENTER);

        JButton exitButton = new JButton("Exit");
        frame.add(exitButton, BorderLayout.SOUTH);
        exitButton.addActionListener(ev -> System.exit(0));

        frame.pack();
        frame.setVisible(true);
    }
}

最佳答案

可以使用 HTML 样式 (CSS) 为 body 设置宽度。这反过来将确定要呈现的行数,并由此确定标签的首选高度。

在 CSS 中设置宽度可以避免计算标签中应该出现换行符的位置(或标签的最佳尺寸)。

import javax.swing.*;

public class FixedWidthLabel {

    public static void main(String[] srgs) {
        final String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eu nulla urna. Donec sit amet risus nisl, a porta enim. Quisque luctus, ligula eu scelerisque gravida, tellus quam vestibulum urna, ut aliquet sapien purus sed erat. Pellentesque consequat vehicula magna, eu aliquam magna interdum porttitor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sollicitudin sapien non leo tempus lobortis. Morbi semper auctor ipsum, a semper quam elementum a. Aliquam eget sem metus.";
        final String html1 = "<html><body style='width: ";
        final String html2 = "px'>";

        Runnable r = new Runnable() {

            @Override
            public void run() {
                JOptionPane.showMessageDialog(
                        null, new JLabel(html1 + "200" + html2 + s));
                JOptionPane.showMessageDialog(
                        null, new JLabel(html1 + "300" + html2 + s));
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

enter image description here enter image description here

关于java - 使用 BufferedImage 时 Swing HTML 渲染发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45787659/

相关文章:

java - 试图让java按字母顺序排列城市。不会工作,我是java新手

java - java中不正确的对象创建

javascript - 通过 JQuery 制作 POST API 时显示负载微调器

python - 使用 Python 从可变图像大小/长宽比创建裁剪缩略图

java - hasAlpha 与 getAlphaRaster

ios - bundle 大量图像/图标

java - HttpURLConnection - 返回格式

java - 碰撞检测中的 NullPointerException

html - 没有图标请求

javascript - 无法使用Javascript/JQuery更改视频静音属性