动态添加到JScrollPane而不删除子组件

时间:2017-04-29 18:08:34

标签: java swing

我目前通过按下按钮将JPanels添加到JScrollPane:

JScrollPane before adding child panel

JScrollPane after adding child panel

但是,当向滚动窗格添加多个面板时,我无法将面板堆叠在一起。当我调用getViewport()时,滚动窗格中先前添加的面板似乎被删除了.add()。

有没有办法让JScrollPane保存它的孩子,并在按下按钮的同时添加多个JPanel时使我的GUI看起来像这样?

Mockup of what it should look like

  1. 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);
    }
    
  2. 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;
    }
    }
    

1 个答案:

答案 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并使用允许您自定义行为的方法。

相关问题