当面板处于滚动窗格中时,面板不会滚动到下一个组件

时间:2014-06-29 20:19:41

标签: java swing layout jpanel jscrollpane

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

这是一张图片,并且让小组循环的jscrollpane位于中间:http://puu.sh/9PFl2/5f824e88c6.png

因此,当我尝试向下滚动时,它只显示组件滞后且下面的组件未加载,我在单击按钮时使用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在其位置设置的,使用空布局。

1 个答案:

答案 0 :(得分:3)

为什么要扩展JScrollPane?如果我是你,我会避免这样做,尤其是我不会改变视口的布局。这可能会让你感到困惑。

此外,您对setBounds(...)的调用表明,您的某些GUI使用了null布局,另外一件事可能会使JScrollPanes和GUI陷入困境,因为它们会导致非常不灵活的GUI和虽然在一个平台上它们看起来不错但在大多数其他平台或屏幕分辨率上看起来很糟糕,而且很难更新和维护。如果可能,您将希望避免使用这些。