我是一名使用NetBeans的Swing新手。我想垂直滾動兩個並排的JTextPane。滾動應該同步並通過單個滾動條完成。如何滾動兩個JTextPane的?
如果我從NetBean設計器添加JTextPanes,它們會自動放入JScrollPane中,以便它們獨立滾動。我已經刪除了封閉的滾動窗格,並將它們放在JPanel中,所以JPanel可以是單個JScrollPane的客戶端。這似乎工作,除了當JTextPanes非常長時,他們似乎在JPanel的末尾。我可以將面板和兩個文本窗格滾動到某個點。當我到達底部時,我可以在文本窗格之一中放置一個cusor,並將箭頭放在我的視野之外。
這裏是我的主要方法的代碼。我從NetBeans設計器生成的東西中複製了佈局。
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
topFrame aTopFrame = new topFrame();
JScrollPane scollBothDiffs = new javax.swing.JScrollPane();
JPanel bothDiffsPanel = new javax.swing.JPanel();
JTextPane leftDiffPane = diffPane1;
JTextPane rightDiffPane = diffPane2;
javax.swing.GroupLayout bothDiffsPanelLayout = new javax.swing.GroupLayout(bothDiffsPanel);
bothDiffsPanel.setLayout(bothDiffsPanelLayout);
bothDiffsPanelLayout.setHorizontalGroup(
bothDiffsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(bothDiffsPanelLayout.createSequentialGroup()
.addGap(20, 20, 20)
.addComponent(leftDiffPane, javax.swing.GroupLayout.PREFERRED_SIZE, 463, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(rightDiffPane, javax.swing.GroupLayout.PREFERRED_SIZE, 463, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(52, Short.MAX_VALUE))
);
bothDiffsPanelLayout.setVerticalGroup(
bothDiffsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, bothDiffsPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(bothDiffsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(rightDiffPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 630, Short.MAX_VALUE)
.addComponent(leftDiffPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 630, Short.MAX_VALUE))
.addContainerGap())
);
scollBothDiffs.setViewportView(bothDiffsPanel);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(aTopFrame.getContentPane());
aTopFrame.getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(20, 20, 20)
.addComponent(scollBothDiffs, javax.swing.GroupLayout.DEFAULT_SIZE, 997, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(scollBothDiffs, javax.swing.GroupLayout.DEFAULT_SIZE, 671, Short.MAX_VALUE)
.addContainerGap())
);
aTopFrame.pack();
aTopFrame.setVisible(true);
}
});
這是一個圖像,顯示我的第一個答案的實現,其中文本窗格不限於水平顯示區域。
而且這個圖片顯示了水平顯示區域中限定的文本窗格,但是如果文本窗格非常長,這個例子有不垂直滾動的原始問題。
這幾乎可以工作,但左側窗格比右側寬,因爲右側有一些寬度被滾動條所吞噬。這意味着兩個窗格不會相同,因此當您沿着窗格向下時文本不同步。 – mikeatv 2011-06-16 23:58:21
@mikeatv:閱讀正確使用佈局管理器的Swing教程,確保兩個JScrollPanes都顯示相同的滾動條。 – 2011-06-17 00:56:38
+1,無需隱藏滾動條,只需共享模型即可使用滾動條滾動兩個文本窗格。是的,這種技術只適用於相同尺寸的文本窗格。 – camickr 2011-06-17 01:38:50