這是一個littel SSCCE,它顯示了奇怪的滾動行爲。當你啓動它時,它會滾動到滾動條的底部。但我希望它保持在最佳狀態。到目前爲止,我發現,這隻發生在JTextPanes上,甚至沒有發生在JTextArea上。這也只會發生,如果你在美國東部時間。從SSCCE中刪除invokeLater(),它按預期工作。然而,這不是一個解決方案(對我來說)。JTextPane正在將其父級Scrollpane滾動到底部
我也試過了,但沒有效果:
final DefaultCaret caret = (DefaultCaret) tp.getCaret();
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
我要的是一個乾淨的和通用的解決方案。因此,我想知道實際觸發滾動的內容,因此我可以擴展JTextPane或其使用的StyledDocument或其他任何內容以默認情況下避免這種情況。在我的情況下,我主要使用JTextPane作爲不可編輯的多行文本,因爲它支持文本和不同字體大小和樣式的對齊。所以實際上我可以放棄編輯功能,如果我解決這個滾動問題。如果可能的話,我不想在添加所有內容後設置ScrollPane的滾動位置,因爲我發現這是一個非常糟糕的解決方法。
感謝您的幫助。這裏是SSCCE:
import java.awt.LayoutManager;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
public class ScrollPaneWithTextPanes
{
public static void main(final String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
final JPanel p = new JPanel();
final LayoutManager layout = new BoxLayout(p, BoxLayout.Y_AXIS);
p.setLayout(layout);
for (int i = 0; i < 10; i++)
{
final JTextPane tp = new JTextPane();
tp.setText("This is some text in text pane " + i);
p.add(tp);
// final DefaultCaret caret = (DefaultCaret) tp.getCaret();
// caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
}
final JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(p));
f.setSize(800, 200);
f.setLocation(0, 0);
f.setVisible(true);
}
});
}
}
嗯...爲什麼多個文本窗格?如果他們是故意的,我們將不得不深入添加組件,而不是插入/文本面板本身。 – kleopatra
@kleopatra是的,這是故意的。我無法改變它。 挖掘組件的添加意味着什麼? JPanel和BoxLayout是標準組件,所以我如何影響添加過程?不過,我只是好奇而已。其實我對目前的解決方案非常滿意。 – haferblues