你混合重物( AWT)組件與輕量級(Swing)組件,這是不明智的,因爲它們不會很好地一起玩。
JScrollPane
包含JViewPort
,您可以在其上添加子組件,即AKA視圖。
(從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);
}
}
}
1)* 「按鈕添加到'jScrollPane'一個組成部分。」 * a)爲'jScrollPane'(注意是大寫的'J')二)爲什麼這樣做的按鈕點擊而不是在創建GUI時?這裏用什麼來改變現有的GUI? 2)在'jScrollPane.getViewport().add(new Component());'不要將基於AWT的組件添加到沒有正當理由的Swing GUI中。爲了測試添加一個'現實'的組件 - 一個默認的'JTree'帶有一些數據。 3)爲了更快得到更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –