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

Java 动态添加到JScrollPane而不删除子组件,java,swing,Java,Swing,我目前正在通过按下按钮将JPanel添加到JScrollPane: 但是,在向滚动窗格添加多个面板时,我无法使面板堆叠在彼此的顶部。调用getViewport().add()时,滚动窗格中先前添加的面板似乎被删除 当按下按钮添加多个JPanel时,有没有办法让JScrollPane保存它的子项并使我的GUI看起来像这样 主窗口类: JScrollPane trackerPanel = new JScrollPane(); trackerPanel.setVerticalScrollBarP

我目前正在通过按下按钮将JPanel添加到JScrollPane:

但是,在向滚动窗格添加多个面板时,我无法使面板堆叠在彼此的顶部。调用getViewport().add()时,滚动窗格中先前添加的面板似乎被删除

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

  • 主窗口类:

    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);
    }
    
  • 跟踪类:

    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;
    }
    }
    

  • 创建GUI的基本逻辑应为:

    JPanel somePanel = new JPanel( some layout );
    JScrollPane scrollPane = new JScrollPane( somePanel );
    frame.add(scrollPane. BorderLayout.CENTER);
    
    然后在添加新面板的
    ActionListener
    中,您只需执行以下操作:

    somePanel.add( new TrackerTile() );
    
    因此,这就像向面板添加组件一样。唯一的区别是panal已添加到滚动窗格中

    不需要实现可滚动的
    。但是,如果您真的想自定义可滚动属性,那么您需要在“somePanel”上实现可滚动,而不是在添加到“somePanel”的单个组件上实现可滚动


    或者另一个选项是使用,它实现了可滚动的界面,并具有允许您自定义行为的方法。

    创建GUI的基本逻辑应该是:

    JPanel somePanel = new JPanel( some layout );
    JScrollPane scrollPane = new JScrollPane( somePanel );
    frame.add(scrollPane. BorderLayout.CENTER);
    
    然后在添加新面板的
    ActionListener
    中,您只需执行以下操作:

    somePanel.add( new TrackerTile() );
    
    因此,这就像向面板添加组件一样。唯一的区别是panal已添加到滚动窗格中

    不需要实现可滚动的
    。但是,如果您真的想自定义可滚动属性,那么您需要在“somePanel”上实现可滚动,而不是在添加到“somePanel”的单个组件上实现可滚动


    或者另一个选项是使用,它实现了可滚动的
    界面,并具有允许您自定义行为的方法。

    JPanel正在运行时添加,因此JScrollPane视口正在更改,但它不保留以前添加到视口的JPanel。@Simmeringc,因为你的逻辑是错误的。我刚才告诉过你解决问题的正确方法。您不会一直将面板添加到视口中。视口中一次只能存在一个组件。您需要将组件添加到添加到视口的基础面板中。那么有没有办法从我的图片创建类似平铺的结构?我想我明白你的意思了,在滚动窗格中向面板添加面板。@Simmeringc如果不使用滚动窗格,你会怎么做?创建“主”面板,然后将“子”面板添加到“主”面板。这部分逻辑没有改变。唯一的区别是没有将“主”面板添加到框架中。您将“主”面板添加到滚动面板,并将滚动窗格添加到框架。因此,当将一组子面板添加到我的父面板时,如何正确地更改父面板的尺寸并将其添加到scroll。jpanel将在运行时添加,因此,JScrollPane视口正在更改,但它没有保留以前添加到视口中的JPanel。@Simmeringc,因为您的逻辑是错误的。我刚才告诉过你解决问题的正确方法。您不会一直将面板添加到视口中。视口中一次只能存在一个组件。您需要将组件添加到添加到视口的基础面板中。那么有没有办法从我的图片创建类似平铺的结构?我想我明白你的意思了,在滚动窗格中向面板添加面板。@Simmeringc如果不使用滚动窗格,你会怎么做?创建“主”面板,然后将“子”面板添加到“主”面板。这部分逻辑没有改变。唯一的区别是没有将“主”面板添加到框架中。将“主”面板添加到滚动面板,并将滚动面板添加到框架。因此,当将一组子面板添加到父面板时,如何正确更改父面板的尺寸并使其滚动。