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