java - Swing HTML rendering changing when using BufferedImage -
the behaviour of labels containing html seems change when first painted bufferedimage. in code follows, first 2 lines of text displayed. number of lines increases more <br>
breaks added. seems calculating number of lines pre-wrapping rather post-wrapping.
if label painted directly component's graphic (i.e. commented line) works fine.
why behaviour change if it's painted bufferedimage
's graphic rather jcomponent
's.
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 requires wrapping because " + "it long single line of label , 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); } }
a width can set body
using html styles (css). in turn determine number of lines render and, that, preferred height of label.
setting width in css avoids need compute line breaks should occur in (or best size of) label.
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, 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, 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); } }
Comments
Post a Comment