Java 动态添加到JScrollPane而不删除子组件
我目前正在通过按下按钮将JPanel添加到JScrollPane: 但是,在向滚动窗格添加多个面板时,我无法使面板堆叠在彼此的顶部。调用getViewport().add()时,滚动窗格中先前添加的面板似乎被删除 当按下按钮添加多个JPanel时,有没有办法让JScrollPane保存它的子项并使我的GUI看起来像这样Java 动态添加到JScrollPane而不删除子组件,java,swing,Java,Swing,我目前正在通过按下按钮将JPanel添加到JScrollPane: 但是,在向滚动窗格添加多个面板时,我无法使面板堆叠在彼此的顶部。调用getViewport().add()时,滚动窗格中先前添加的面板似乎被删除 当按下按钮添加多个JPanel时,有没有办法让JScrollPane保存它的子项并使我的GUI看起来像这样 主窗口类: JScrollPane trackerPanel = new JScrollPane(); trackerPanel.setVerticalScrollBarP
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如果不使用滚动窗格,你会怎么做?创建“主”面板,然后将“子”面板添加到“主”面板。这部分逻辑没有改变。唯一的区别是没有将“主”面板添加到框架中。将“主”面板添加到滚动面板,并将滚动面板添加到框架。因此,当将一组子面板添加到父面板时,如何正确更改父面板的尺寸并使其滚动。