JPanel を保持する JScrollPane があります。JPanel のレイアウトは GridBagLayout です。その JPanel に、いくつかのカスタム コンポーネントを追加します。それぞれが 3 つの JLabels を持つ JPanel です。
プログラムで初めてこのすべてをレイアウトすると、正常に動作します。別のカスタム コンポーネントを JPanel に追加するコードを呼び出すと、パネルは空に見えますが、JPanel の内容を調べて、コンポーネントが実際にそこにあることを確認できます。このすべてのサイトで JDialog のサイズを変更すると、JPanel は適切に描画されます。JScrollPane を少しでも水平にスクロールしても機能します。
アイテムを追加するときと同じ方法で初期レイアウトを作成します。
repaint()、invalidate()、および doLayout() のさまざまな組み合わせを試しましたが、常に機能するものはないようです。以前にこの状況に遭遇したことがあり、完全に解決できたことはありません。助言がありますか?
OpenJDK 7u25 で実行されます。以下は、スクロール ペインとパネルを配置するコードです。
private void displayRelatedBug(ArrayList<Bug> a_bugs) {
// sort the bugs by ID
ArrayList<Bug> l_sorted = new ArrayList<>(a_bugs);
Collections.sort(l_sorted);
pnlRelatedBugs.removeAll();
pnlRelatedBugs.setLayout(new GridBagLayout());
GridBagConstraints l_gbc = new GridBagConstraints();
l_gbc.gridx = 0;
l_gbc.gridy = 0;
l_gbc.gridwidth = 1;
l_gbc.gridheight = 1;
l_gbc.anchor = GridBagConstraints.NORTHWEST;
l_gbc.fill = GridBagConstraints.NONE;
l_gbc.insets = new Insets(3, 4, 0, 0);
for (Bug r : l_sorted) {
pnlRelatedBugs.add(new RelatedBugDisplay(r, this), l_gbc);
l_gbc.gridy++;
}
// add a filler at the bottom to push it up
l_gbc.weighty = 1.0;
pnlRelatedBugs.add(new MMPanel(), l_gbc);
// add a filler on the right to push them left
l_gbc.weighty = 0.0;
l_gbc.weightx = 1.0;
l_gbc.gridx++;
pnlRelatedBugs.add(new MMPanel(), l_gbc);
// try in vain to make it show up!!!
pnlRelatedBugs.invalidate();
pnlRelatedBugs.doLayout();
pnlRelatedBugs.repaint();
scrollerRelatedBugs.doLayout();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
pnlRelatedBugs.repaint();
scrollerRelatedBugs.repaint();
// this seems to help if the scroll bar is showing
scrollerRelatedBugs.getHorizontalScrollBar().setValue(1);
scrollerRelatedBugs.getHorizontalScrollBar().setValue(0);
}
});
}