您将重量级 (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
which 来访问它,这将返回由视口管理的组件。
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);
}
}
}