Das Verhalten von HTML-Etiketten scheint sich zu ändern, wenn sie zum ersten Mal in BufferedImage gezeichnet werden. In dem folgenden Code werden nur die ersten beiden Zeilen des Texts angezeigt. Die Anzahl der Zeilen erhöht sich, je mehr <br>
Pausen hinzugefügt werden. Es scheint die Anzahl der Zeilen vor dem Einwickeln und nicht nach dem Einwickeln zu berechnen.Swing-HTML-Rendering ändert sich bei Verwendung von BufferedImage
Wenn das Etikett direkt auf die Grafik der Komponente (d. H. Die kommentierte Linie) gemalt wird, funktioniert es einwandfrei.
Warum würde sich das Verhalten ändern, wenn es auf eine BufferedImage
Grafik anstatt einer JComponent
s gemalt wird.
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);
}
}
Vielen Dank für Ihre Antwort. Ich bin mir der Verwendung von Breiten im HTML bewusst. Ich stellte die Frage, weil ich an einer Erklärung des unterschiedlichen Verhaltens interessiert war und nicht daran, wie ich es ändern könnte. – sprinter
Die Größe einer 'JLabel', die als Komponente angezeigt wird, wird normalerweise vom Layout des übergeordneten Containers gesteuert. Wenn die Breite eingeschränkt wird, wird der HTML-formatierte Text wahrscheinlich umbrochen. Wenn Sie weitere Untersuchungen durchführen möchten, fügen Sie ein [mcve] des * anderen * Verhaltens hinzu. –