2017-08-20 2 views
1

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); 
    } 
} 

Antwort

3

Eine Breite kann für die body mit HTML-Stile (CSS) eingestellt werden. Dies bestimmt wiederum die Anzahl der zu rendernden Linien und damit die bevorzugte Höhe des Etiketts.

Wenn Sie die Breite in CSS festlegen, müssen Sie nicht berechnen, wo Zeilenumbrüche in der Beschriftung (oder der besten Größe) auftreten sollen.

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 hereenter image description here

+0

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

+0

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. –

Verwandte Themen