重い (AWT) コンポーネントと軽量 (Swing) コンポーネントを混在させています。これらはうまく連携しない傾向があるため、これはお勧めできません。
JScrollPane
JViewPort
には、子コンポーネント (別名ビュー) を追加できる が含まれています。
( JavaDocsの画像)
そのため、呼び出しjScrollPane.getViewport().setLayout(new FlowLayout(FlowLayout.CENTER));
は実際にはJViewPort
のレイアウト マネージャーを設定していますが、これは実際にはお勧めできません。
スクロールペインに追加するコンポーネントを作成し、そのレイアウトを設定し、すべての子コンポーネントを追加してからスクロールペインに追加する必要があります。必要に応じて、後の段階で「ビュー」にコンポーネントを追加できますが、それはあなた次第です...
// Declare "view" as a class variable...
view = new JPanel(); // FlowLayout is the default layout manager
// Add the components you need now to the "view"
JScrollPane scrollPane = new JScrollPane(view);
これで、必要に応じて新しいコンポーネントをビューに追加できます...
view.add(...);
への参照を保持したくない場合はview
、 を呼び出すことJViewport#getView
でアクセスできます。これにより、ビュー ポートによって管理されているコンポーネントが返されます。
JPanel view = (JPanel)scrollPane.getViewPort().getView();
実施例
これは私にとってはうまくいきます...
nb-view.validate()
新しいコンポーネントを追加した後、あなたが持っていなかったかもしれないコードに追加しました...
public class TestScrollPane01 {
public static void main(String[] args) {
new TestScrollPane01();
}
public TestScrollPane01() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new MainPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MainPane extends JPanel {
private JScrollPane scrollPane;
private int count;
public MainPane() {
setLayout(new BorderLayout());
scrollPane = new JScrollPane(new JPanel());
((JPanel)scrollPane.getViewport().getView()).add(new JLabel("First"));
add(scrollPane);
JButton add = new JButton("Add");
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPanel view = ((JPanel)scrollPane.getViewport().getView());
view.add(new JLabel("Added " + (++count)));
view.validate();
}
});
add(add, BorderLayout.SOUTH);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}