1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| public class TextBuilder {
private AttributedString string;
private List<TextLayout> layouts;
private int x;
private int y;
private JPanel panel;
public TextBuilder(AttributedString string, int x, int y, JPanel panel) {
this.string=string;
this.panel=panel;
this.x=x;
this.y=y;
panel.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent event) {
autoLineBreaker(); // on recalcule le layout
}
});
}
public void setString(AttributedString string) {
this.string=string;
autoLineBreaker(); // on recalcule le layout
panel.repaint();
}
public void setPosition(int x, int y) {
this.x=x;
this.y=y;
}
// la j'ai juste reprise ta méthode, sans en modifier le traitement, en enlevant juste ce qui n'était pas nécessaire
// on pourrait également profiter de cette méthode pour savoir les dimensions du texte
private void autoLineBreaker(){
AttributedCharacterIterator paragraph = string.getIterator();
int paragraphStart = paragraph.getBeginIndex();
int paragraphEnd = paragraph.getEndIndex();
FontRenderContext frc = new FontRenderContext(null, true, true); // rendu haute qualité
LineBreakMeasurer lineMeasurer = new LineBreakMeasurer(paragraph, frc);
float breakWidth = (float)panel.getSize().width-x;
lineMeasurer.setPosition(paragraphStart);
layouts=new ArrayList<>();
while (lineMeasurer.getPosition() < paragraphEnd) {
layouts.add(lineMeasurer.nextLayout(breakWidth)); // ne tient pas compte des \n
}
}
public void draw(Graphics2D g2d) {
Object memTextAntiAlias = g2d.getRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING);
g2d.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
if ( layouts==null ) autoLineBreaker();
float breakWidth = (float)panel.getSize().width;
float drawPosY = y;
for(TextLayout layout : layouts) {
float drawPosX = x + (layout.isLeftToRight()
? 0 : breakWidth - layout.getAdvance());
drawPosY += layout.getAscent();
layout.draw(g2d, drawPosX, drawPosY);
drawPosY += layout.getDescent() + layout.getLeading();
}
g2d.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
memTextAntiAlias );
}
} |
Partager