Java 面板在';它在滚动窗格中

Java 面板在';它在滚动窗格中,java,swing,layout,jpanel,jscrollpane,Java,Swing,Layout,Jpanel,Jscrollpane,我使面板工具也可滚动,因此它可以轻松滚动,但仍然无法工作 这是一张图片,循环面板中的JSCROLBONE在中间: 所以当我尝试向下滚动时,它只显示滞后的组件,下面的组件没有加载,我用system.out.println()测试了这一点,当单击一个按钮时,最后一个给出了相同的数字,即5,表示相同的数字 这是我的滚动窗格类: public BackupsStage(){ setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_S

我使面板工具也可滚动,因此它可以轻松滚动,但仍然无法工作

这是一张图片,循环面板中的JSCROLBONE在中间:

所以当我尝试向下滚动时,它只显示滞后的组件,下面的组件没有加载,我用system.out.println()测试了这一点,当单击一个按钮时,最后一个给出了相同的数字,即5,表示相同的数字

这是我的滚动窗格类:

    public BackupsStage(){
        setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        getViewport().setLayout(new GridBagLayout());
        setViewportBorder(new LineBorder(Color.RED));
        panel = new BackupPanel();
        getViewport().add(panel);
        setBounds(5, 125, 985, 280);
        setVisible(false);
        current = this;
}
这是我的小组课:

    private class BackupPanel extends JPanel implements Scrollable{
    public BackupPanel() {
        setLayout(new GridLayout(0, 1));
    }
    @Override
    public Dimension getPreferredScrollableViewportSize() {
        return super.getPreferredSize();
    }

    @Override
    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
        return 100;
    }

    @Override
    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
        return 16;
    }

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return true;
    }

    @Override
    public boolean getScrollableTracksViewportHeight() {
        return true;
    }
}
以下是我用来添加到面板的代码:

  public static void loadBackupOntoStage(String username,int hour,int minute, int backupNum){
    JButton revert = new JButton("Revert " + username + " to this backup");
    revert.setFont(new Font("Tahoma", Font.BOLD, 9));
    revert.setFocusPainted(false);
   // revert.setVisible(false);
    panel.add(revert);
    revert_buttons.put(String.valueOf(backupNum - 1),revert);

    JLabel label = new JLabel("Backup created " + hour + " hours and " + minute + " minutes ago");
    label.setFont(new Font("Tahoma", Font.BOLD, 14));
    label.setForeground(Color.DARK_GRAY);
    panel.add(label);
   // label.setVisible(false);
    backups.put(String.valueOf(backupNum - 1),label);

    JSeparator hsep = new JSeparator(JSeparator.HORIZONTAL);
   // hsep.setVisible(false);
    panel.add(hsep);
    current.setVisible(true);
    revert.addActionListener(e -> {
        System.out.print(backupNum - 1);
        String answer = JOptionPane.showInputDialog(
                FullMode.current
                , "Please type REVERT to confirm reverting " + username + " to this backup.\nThere is no going back after this."
                , "Reverting"
                , JOptionPane.WARNING_MESSAGE

        );
        if (answer.equalsIgnoreCase("revert")) {
            // todo
        }
    });
}
那么我做错了什么


哦,也许你应该知道滚动窗格是由setBounds设置的,使用空布局。

为什么要扩展JScrollPane?如果我是你,我会避免这样做,尤其是,我不会更改视口的布局。这可能会把你搞砸


您对
setBounds(…)
的调用也表明您的一些GUI使用了
null
布局,另一件事可能会使JScrollPanes和GUI变得非常死板,因为它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,并且很难更新和维护。如果可能的话,您将希望避免使用这些

为什么要扩展JScrollPane?如果我是你,我会避免这样做,尤其是,我不会更改视口的布局。这可能会把你搞砸


您对
setBounds(…)
的调用也表明您的一些GUI使用了
null
布局,另一件事可能会使JScrollPanes和GUI变得非常死板,因为它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,并且很难更新和维护。如果可能的话,您将希望避免使用这些

为什么要扩展JScrollPane?如果我是你,我会避免这样做,尤其是,我不会更改视口的布局。这可能会把你搞砸


您对
setBounds(…)
的调用也表明您的一些GUI使用了
null
布局,另一件事可能会使JScrollPanes和GUI变得非常死板,因为它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,并且很难更新和维护。如果可能的话,您将希望避免使用这些

为什么要扩展JScrollPane?如果我是你,我会避免这样做,尤其是,我不会更改视口的布局。这可能会把你搞砸


您对
setBounds(…)
的调用也表明您的一些GUI使用了
null
布局,另一件事可能会使JScrollPanes和GUI变得非常死板,因为它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,并且很难更新和维护。如果可能的话,您将希望避免使用这些

我删除了视口的布局,但现在jscrollpane只是强制所有组件随着它们的增加而不断变小,从而消除了滚动条的出现,我的意思是:@user3637864:这个问题正在变成一个
“猜猜我没有向您展示的代码在做什么”
类型问题。请通过创建并发布您的应用程序来解决此问题,以便我们审查、测试并可能进行修复。是的,这需要您付出一些额外的努力,但最终还是值得的,因为如果您能够做到这一点,您可能会很快得到一个有用的答案。+1表示不使用空布局和不更改视口布局@用户3637864,当面板的“首选大小”大于滚动窗格的“大小”时,滚动条将自动显示。您无需实现可滚动的
界面。只需使用适当的布局管理器,首选大小将自动计算。如果要动态添加组件,则需要
revalidate()
面板,以便重新计算首选大小。@user3637864:请重新查看,因为这需要您付出更多的努力。该链接将准确地告诉您满足mcve要求所需的内容。我删除了视口的布局,但现在jscrollpane只是强制所有组件随着它们的增加而不断变小,从而消除了滚动条的出现,我的意思是:@user3637864:这个问题正在成为一个
“猜猜我没给你看的代码在做什么“
键入问题。请通过创建并发布您的应用程序来解决此问题,以便我们审查、测试并可能进行修复。是的,这需要您付出一些额外的努力,但最终还是值得的,因为如果您能够做到这一点,您可能会很快得到一个有用的答案。+1表示不使用空布局和不更改视口布局@用户3637864,当面板的“首选大小”大于滚动窗格的“大小”时,滚动条将自动显示。您无需实现可滚动的
界面。只需使用适当的布局管理器,首选大小将自动计算。如果要动态添加组件,则需要
revalidate()
面板,以便重新计算首选大小。@user3637864:请重新查看,因为这需要您付出更多的努力。该链接将准确地告诉您满足mcve要求所需的内容。我删除了视口的布局,但现在jscrollpane只会强制所有组件随着它们的增加而不断变小,从而消除了显示的滚动条,我的意思是:@user3637864:T