Я новичок в Swing, использующий NetBeans. Я хочу вертикально прокрутить два JTextPane бок о бок. Прокрутка должна быть синхронизирована и выполнена с помощью одной полосы прокрутки.
Если я добавлю JTextPanes из конструктора NetBean, они автоматически помещаются в JScrollPane, поэтому они прокручиваются независимо. Я удалил вмещающие панели прокрутки и поместил их в JPanel вместо этого, чтобы JPanel мог быть клиентом единственной JScrollPane. Это похоже на работу, за исключением того, что когда JTextPanes очень длинные, они, кажется, идут за концом JPanel. Я могу прокрутить панель и обе текстовые панели до определенной точки. Достигнув дна, я могу навести курсор на одну из текстовых панелей и стрелку вниз за пределами поля зрения.
Вот код из моего основного метода. Я скопировал макет из чего-то, сгенерированного конструктором 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);
}
});
Вот изображение, которое показывает мою реализацию первого ответа, где текстовые панели не ограничены горизонтальной областью отображения.
![Image showing text panes that are too wide for the horizontal display area](https://i.stack.imgur.com/anncN.jpg)
И на этом изображении показаны текстовые панели, ограниченные в горизонтальной области отображения, но в этом примере исходная проблема заключается в отсутствии прокрутки по вертикали, если текстовые панели очень длинные.
![Image showing text panes that are bounded horizontally](https://i.stack.imgur.com/2rDB8.jpg)