[英]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.