我有一个jScrollPane
和表单上的按钮。 按钮增加了一个组件jScrollPane
。 我使用FlowLayout
与居中对齐安排内部的元器件jScrollPane
。
第一个组件出现没有问题,是完全一致。 当我再次按下按钮,似乎没有什么太大发生。 当我按照调试它表明,一切都像以前发生的准确。
单击该按钮当这样被执行的代码:
jScrollPane.getViewport().add(new Component());
这就是我在设置FlowLayout
的Viewport
的的jScrollPane
:
jScrollPane.getViewport().setLayout(new FlowLayout(FlowLayout.CENTER));
你混合重物(AWT)组件具有重量轻(摇摆)的组件,这是不可取的,因为他们不倾向于发挥得很好。
JScrollPane
包含JViewPort
上,您可以添加一个子组件,AKA的看法。
(从所述图像的JavaDoc )
因此呼叫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);
}
}
}