我目前通过按下按钮将JPanels添加到JScrollPane:
但是,当向滚动窗格添加多个面板时,我无法将面板堆叠在一起。当我调用getViewport()时,滚动窗格中先前添加的面板似乎被删除了.add()。
有没有办法让JScrollPane保存它的孩子,并在按下按钮的同时添加多个JPanel时使我的GUI看起来像这样?
MainWindow类:
JScrollPane trackerPanel = new JScrollPane();
trackerPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
trackerPanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
trackerPanel.setPreferredSize(new Dimension(500, 400));
frame.getContentPane().add(BorderLayout.NORTH, trackerPanel);
frame.setVisible(true);
//method: called from EnterButtonListener to create and append TrackerTile to GUI
public void addTrackerTile() {
incrementTrackerPanelCounter();
TrackerTile trackerTile = new TrackerTile();
trackerPanel.getViewport().add(trackerTile);
}
TrackerTile类:
public class TrackerTile extends JPanel implements Scrollable {
public Dimension preferredSize = new Dimension(794, 100);
public TrackerTile() {
setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
@Override
public Dimension getPreferredSize() {
return preferredSize;
}
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(794, 100);
}
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 128;
}
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return 128;
}
public boolean getScrollableTracksViewportWidth() {
return false;
}
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
答案 0 :(得分:2)
创建GUI的基本逻辑应该是:
JPanel somePanel = new JPanel( some layout );
JScrollPane scrollPane = new JScrollPane( somePanel );
frame.add(scrollPane. BorderLayout.CENTER);
然后在添加新面板的ActionListener
中,您只需执行以下操作:
somePanel.add( new TrackerTile() );
所以它就像向面板添加组件一样。唯一的区别是panal已添加到滚动窗格中。
无需实施Scrollable
。但是如果你真的想自定义Scrollable properties
,那么你需要在“somePanel”上实现Scrollable,而不是你添加到“somePanel”的各个组件。
或者另一种选择是使用实现Scrollable
接口的question并使用允许您自定义行为的方法。