4

Currently it looks so

enter image description here

What to do so that it looks so?

enter image description here

Below is my code:

    JFrame f = new JFrame();
    JTextPane textPane = new JTextPane();

    JTextField component = new JTextField("      ");
    component.setMaximumSize(component.getPreferredSize());
    textPane.setSelectionStart(textPane.getDocument().getLength());
    textPane.setSelectionEnd(textPane.getDocument().getLength());
    textPane.insertComponent(component);
    try {
        textPane.getDocument().insertString(textPane.getDocument().getLength(), "text",
            new SimpleAttributeSet());
    } catch (BadLocationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    f.add(new JScrollPane(textPane));
    f.setSize(200, 100);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);

The single question which is near to this topic I found: JTextPane insert component, faulty vertical alignment But there is no answer how to change the alignment. But it must be possible according to the discussion there.

Community
  • 1
  • 1
ka3ak
  • 2,435
  • 2
  • 30
  • 57
  • 1
    @DavidKroukamp I thought that the vertical alignment affects vertical positioning. The text at the second picture is positioned lower than the text at the first one. – ka3ak Dec 18 '12 at 13:09

3 Answers3

7

You can use this http://java-sl.com/tip_center_vertically.html

It should work with JComponents as well.

You can also override LabelView's getPreferredSpan() adding some space to the bottom.

Alternatively you can try to override RowView inner class in ParagraphView

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/swing/text/ParagraphView.java#ParagraphView.Row

That points to inner class Row extends BoxView

You should replace it with own one. Try to override

public float getAlignment(int axis) 

to return CENTER (0.5). If this does not help override layoutMinorAxis(0 to return proper offsets (shifted).

StanislavL
  • 56,971
  • 9
  • 68
  • 98
  • getPrefferedSpan() does the job. I can adjust text position with a constant value. But what if components of different size are used? I want everything to look similar to a skewer of meat. Although the cuts of meat can have different size they are all skewered through their center. Skewer is text. Can this be done with "RowView" and "ParagraphView"? If so, I couldn't understand how a class can be overridden and there is also no such inner class in the ParagraphView. – ka3ak Dec 18 '12 at 15:08
  • Thanks! The overriding of getAlignment() has helped. – ka3ak Dec 18 '12 at 15:42
  • @StanislavL Thank you for `CenteredBoxView`, +1! One question though, shouldn't it be `textBlockHeight += spans[i];` in `CenteredBoxView.layoutMajorAxis()` instead of `textBlockHeight = spans[i];`? – tenorsax Sep 17 '14 at 23:22
  • None of the links work any more. – Ti Strga Feb 21 '23 at 21:58
1

Define a style for your document with a JLabel and set the vertical aligment on it:

Style s = doc.addStyle("icUf", regular);        
ImageIcon icUf = createImageIcon("uf.png", "Unidad Funcional");
if (icUf != null) {
    JLabel jl = new JLabel(icUf);
    jl.setVerticalAlignment(JLabel.CENTER);
    StyleConstants.setComponent(s, jl);
}

Insert the label:

doc.insertString(doc.getLength(), " ", doc.getStyle("icUf"));

and the text:

doc.insertString(doc.getLength(), " text ", doc.getStyle("bold"));
david
  • 61
  • 1
  • 1
0

Based on the answer above (which didn't work for me, but helped me find this), I used:

Style s = doc.addStyle("icUf", regular);        
ImageIcon icUf = createImageIcon("uf.png", "Unidad Funcional");
if (icUf != null) {
    // create label with icon AND text
    JLabel jl = new JLabel("some text",icUf, SwingConstants.LEFT);
    StyleConstants.setComponent(s, jl);
}
doc.insertString(doc.getLength(), " ", doc.getStyle("icUf"))

This properly aligned the text 'some text' and the icon.

user114676
  • 482
  • 5
  • 9