簡體   English   中英

如何在 JTextArea 中垂直居中文本?

[英]How can I center a text vertically within a JTextArea?

我有一個帶有長文本的 JTextArea。 在文本中有一個字符串“abc”,我希望它顯示在文本區域的中間(垂直)。 我可以使用 setCaretPosition 使 ScrollPane 滾動到足以讓字符串“abc”滾動到視圖中。 滾動繼續,直到文本“abc”在文本區域底部可見(參見示例)如何讓滾動條滾動到文本“abc”顯示在可見區域的中間(垂直) ?

非常感謝您的幫助!

public class TestCenter {

    public TestCenter() {
        JFrame frame = new JFrame();
        JTextArea ta = new JTextArea();

        frame.setMinimumSize(new Dimension(800, 600));
        frame.add(new JScrollPane(ta));
        frame.pack();
        frame.setVisible(true);

        SwingUtilities.invokeLater(() -> {
            StringBuilder testText = new StringBuilder();
            for (int t = 0; t < 100; t++) {
                testText.append("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
            }
            testText.append("abc");
            for (int t = 0; t < 100; t++) {
                testText.append("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
            }
            ta.setText(testText.toString());
            ta.setCaretPosition(testText.indexOf("abc"));
        });
    }

    public static void main(String[] args) {
        new TestCenter();
    }

}

要將滾動條移動到要在視口中間垂直顯示的abc文本的 position,我們必須首先找到文本的行號並將其轉換為視圖坐標:

// Find the line number of the "abc" text
int lineNumber = ta.getLineOfOffset(testText.indexOf("abc"));
// Translate the lineNumber to the view rectangle
Rectangle viewRect = ta.modelToView(ta.getLineStartOffset(lineNumber));

現在,有了viewRect ,我們可以獲得視口大小並計算要滾動到的 position Point

Dimension viewportSize = scrollPane.getViewport().getExtentSize();
// Calculate new view position to scroll to
Point scrollPoint = new Point(0, view.y - (viewportSize.height - view.height) / 2);

關於計算scrollPoint的一些解釋。 要計算直線居中的 y 坐標,我們使用以下公式: rect.y - (viewportSize.height - viewRect.height) / 2 我們從總視口大小 ( viewportSize.height ) 中減去線的高度 ( viewRect.height ),這給出了線上方和下方視口中的剩余空間。 然后我們將剩余空間除以2 ,得到視口中心線的 position。

因為我們想要在視口中垂直居中線,所以我們從線的頂部 y 坐標中減去結果值以獲得視口的新 y 坐標。

最后,我們可以使用JViewport::setViewPosition(Point) scrollPoint視口設置為計算出的滾動點:

public TestCenter() {
    JFrame frame = new JFrame();
    JTextArea ta = new JTextArea();
    JScrollPane scrollPane = new JScrollPane(ta);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setMinimumSize(new Dimension(800, 600));
    frame.add(scrollPane);
    frame.pack();
    frame.setVisible(true);

    var testText =
        "xxxxxxxxxxxxxxxxxxxx\n".repeat(100) +
        "abc" +
        "xxxxxxxxxxxxxxxxxxxx\n".repeat(100);
    ta.setText(testText.toString());

    try {
        // Find the line number of the "abc" text
        int lineNumber = ta.getLineOfOffset(testText.indexOf("abc"));
        // Translate the lineNumber to the view rectangle
        Rectangle viewRect = ta.modelToView(ta.getLineStartOffset(lineNumber));
        // Get the size of the viewport
        Dimension viewportSize = scrollPane.getViewport().getExtentSize();
        // Calculate new view position to scroll to
        Point scrollPoint = new Point(0, viewRect.y - (viewportSize.height - viewRect.height) / 2);
        // Move the view to the new position
        scrollPane.getViewport().setViewPosition(scrollPoint);
    } catch (BadLocationException e) {
        throw new RuntimeException(e);
    }
}

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM