3

GUI で PDF ListItem と JTextArea の行間を同期する必要があります。いずれかを調整することでそれを行うことができます。

そして、ListItem (または JTextArea) が複数行の長さ (JTextArea で改行が true に設定されている) でない限り、すべてうまく機能します。

2 つの ListItem 間の高さを調整できます。その距離は、単一の複数行 ListItem の 2 つの行の間の高さにも適用されます。

ただし、私の GUI では、compononet ボーダーと JTextArea のデフォルトの行間により、これら 2 つが同じではありません。違いは約 1 ピクセルですが、大規模になると蓄積して問題を引き起こす可能性があります。

では、JTextArea で行間隔を設定する方法、または 2 つのリスト項目と同じリスト項目の 2 つの行の間のスペースを区別できる方法はありますか?

私は、あらゆる種類の外部ライブラリと、必要なあらゆる種類のトリックを使用することにすべて賛成です...

4

3 に答える 3

4

JTextArea の行間隔をオーバーライドするには、PlainView (PLainDocument のレンダリングに使用) を見てください。

public void paint(Graphics g, Shape a)メソッドには次の行があります

        drawLine(line, g, x, y);
        y += fontHeight;

したがって、y オフセットを修正するレンダリングを適応させることができます。

BasicTextAreaUIビューを作成する方法。独自の実装に置き換えてくださいPlainView

public View create(Element elem) {
    Document doc = elem.getDocument();
    Object i18nFlag = doc.getProperty("i18n"/*AbstractDocument.I18NProperty*/);
    if ((i18nFlag != null) && i18nFlag.equals(Boolean.TRUE)) {
        // build a view that support bidi
        return createI18N(elem);
    } else {
        JTextComponent c = getComponent();
        if (c instanceof JTextArea) {
        JTextArea area = (JTextArea) c;
        View v;
        if (area.getLineWrap()) {
            v = new WrappedPlainView(elem, area.getWrapStyleWord());
        } else {
            v = new PlainView(elem);
        }
        return v;
        }
    }
    return null;
}
于 2012-10-08T13:54:17.657 に答える
1

ParagraphAttributeを使用して、行間のスペースを制御しますSpaceBelow。これは、4行以下のコードで実行できます(以下の例を参照)。JTextPaneこれらのParagraphAttributesを使用するには、を使用する必要があります(ただしJTextPane、JTextArea`は非常に似ているため、違いに気付かないはずです)。

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;


public class LineSpacingExample extends Box{
    JTextPane modifiedTA;
    //Modify this to whatever spacing you want between the rows.
    static final float spaceBelow = 5.0f;
    //Font height - automatically calculated by code below
    int fontHeight = 0;

    public LineSpacingExample(){
        super(BoxLayout.X_AXIS);

        //Demonstrating that the spacing is predictable
        final JPanel leftBox = new CustomBox();
        add(leftBox);

        //Sets the amount of space below a row (only code you need to add)
        DefaultStyledDocument pd = new DefaultStyledDocument();
        SimpleAttributeSet sas = new SimpleAttributeSet();
        StyleConstants.setSpaceBelow(sas, spaceBelow);
        pd.setParagraphAttributes(0, pd.getLength(), sas, false);

        modifiedTA= new JTextPane(pd);  
        add(modifiedTA);

        //Calculates the font height in pixels
        fontHeight = modifiedTA.getFontMetrics(modifiedTA.getFont()).getHeight();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new LineSpacingExample());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    //EXTRA! Paints the left hand side box - to show that the spacing is predictable in pixels
    public class CustomBox extends JPanel{

        public CustomBox() {
            super();
            setOpaque(true);
            setBackground(Color.orange);

        }

        public void paintComponent(Graphics g){
            super.paintComponent(g);
            int height = getSize().height;
            int drawLocation = 2; //To account for padding on the TextPane
            int row = 1;
            while(drawLocation < height){

                //Drawing the text row background
                g.setColor(Color.blue);
                g.fillRect(0, drawLocation, 50, fontHeight);

                //Drawing the text row number
                g.setColor(Color.white);
                g.drawString(Integer.toString(row++), 0, drawLocation+14);
                drawLocation += fontHeight;

                //Drawing the space row
                g.setColor(Color.green);
                g.fillRect(0, drawLocation, 50, (int)spaceBelow);
                drawLocation += spaceBelow;
            }
        }
    };

}
于 2012-10-08T21:19:55.997 に答える
0

JTextPaneの代わりにを使用して、JTextAreaそれに応じて行間隔をListItemsのように設定することができます。

SimpleAttributeSet set = new SimpleAttributeSet();

StyleConstants.setLineSpacing(set, 0.5f);    // <--- your value here

textPane.setParagraphAttributes(set, true);

これは既存のテキストの行間隔には影響しないため、後でテキストを設定する必要があります。

于 2012-10-07T18:39:12.727 に答える