gpt4 book ai didi

Java Swing - 可滚动面板

转载 作者:行者123 更新时间:2023-11-30 06:59:10 26 4
gpt4 key购买 nike

我正在尝试使用 swing 创建一个可滚动面板。但由于我是 Swing 新手,所以我没能做到这一点。在我的代码中,jScrollablePane 内没有显示任何内容。

我创建了一个jframe,并在其中放入了jScrollablePane。我创建了一个名为 UIElement 的类,它扩展了 jPanel,其中包括组件部分和子部分。子部分由其他 UIElement 组成。

  • 所有UIElements都应放置在前一个UIElement下。就像一个垂直列表。
  • 子级应放置在组件下。
  • 子部分无法滚动,其高度固定为子 UIElement 的总高度。
  • 组件的固定高度为 40。而宽度可以随容器扩展。
  • 间隔符的宽度应固定为 40。
  • 除了间隔符之外,所有内容的宽度都是动态的。
  • UIElement 可以有零个或多个子元素。

这是一些图片示例,不要忘记:宽度是动态的。

enter image description here

这是代码:

public static void scrollable(String title) {
//Create and set up the window.
JFrame frame = new JFrame(title);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(500,GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height);

JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.Y_AXIS));
mainPanel.setBackground(Color.WHITE);

mainPanel.add(new UIElement());

JScrollPane scrollPane = new JScrollPane(mainPanel,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
frame.getContentPane().add(scrollPane);

//Display the window.
frame.setVisible(true);
}

这是 UIElement 类:

public abstract class UIElement extends JPanel {
public static final int DESIREDHEIGHT = 40;

JPanel componentsPanel, childPanel;

public UIElement () {
super();
this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
this.setBackground(Color.BLACK);

// componentsPanel
componentsPanel = new JPanel() {
@Override
public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.setSize(d.getWidth(),DESIREDHEIGHT);
return d;
}

@Override
public Dimension getMaximumSize() {
Dimension d = super.getMaximumSize();
d.setSize(d.getWidth(),DESIREDHEIGHT);
return d;
}

@Override
public Dimension getMinimumSize() {
Dimension d = super.getPreferredSize();
d.setSize(d.getWidth(),DESIREDHEIGHT);
return d;
}
};
componentsPanel.setLayout(new BoxLayout(componentsPanel,BoxLayout.X_AXIS));
componentsPanel.setBackground(Color.BLUE);
this.add(componentsPanel);

// child panel
childPanel = new JPanel() {
@Override
public Dimension getPreferredSize() {
float height = 0;
for (Component c: super.getComponents())
height += c.getPreferredSize().height;
Dimension d = super.getPreferredSize();
d.setSize(d.getWidth(),height);
return d;
}

@Override
public Dimension getMaximumSize() {
float height = 0;
for (Component c: super.getComponents())
height += c.getMaximumSize().height;
Dimension d = super.getMaximumSize();
d.setSize(d.getWidth(),height);
return d;
}

@Override
public Dimension getMinimumSize() {
float height = 0;
for (Component c: super.getComponents())
height += c.getMinimumSize().height;
Dimension d = super.getMinimumSize();
d.setSize(d.getWidth(),height);
return d;
}
};
childPanel.setLayout(new BoxLayout(childPanel,BoxLayout.Y_AXIS));
childPanel.setBackground(Color.RED);

// parent for childPanel and spacer
JPanel childParent = new JPanel();
childParent.setLayout(new BoxLayout(childParent,BoxLayout.X_AXIS));

// spacer
JPanel spacer = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(DESIREDHEIGHT,DESIREDHEIGHT);
}

@Override
public Dimension getMaximumSize() {
return new Dimension(DESIREDHEIGHT,DESIREDHEIGHT);
}

@Override
public Dimension getMinimumSize() {
return new Dimension(DESIREDHEIGHT,DESIREDHEIGHT);
}
};
spacer.setBackground(Color.RED);
childParent.add(spacer);
// add the childPanel later
childParent.add(childPanel);
}


@Override
public Dimension getPreferredSize() {
Dimension c = componentsPanel.getPreferredSize();
Dimension d = childPanel.getPreferredSize();
return new Dimension(c.width, c.height + d.height);
}

@Override
public Dimension getMaximumSize() {
Dimension c = componentsPanel.getMaximumSize();
Dimension d = childPanel.getMaximumSize();
return new Dimension(c.width, c.height + d.height);
}

@Override
public Dimension getMinimumSize() {
Dimension c = componentsPanel.getMinimumSize();
Dimension d = childPanel.getMinimumSize();
return new Dimension(c.width, c.height + d.height);
}

}

最佳答案

不要覆盖面板的getPreferredSize()(或最大/最小尺寸)。

每个面板将根据面板的布局管理器和添加到面板的组件来确定其首选尺寸。

也就是说,如果面板使用布局管理器,则无需重写这些方法。您只需重写没有布局管理器的自定义组件的 getPreferredSize() 方法。用 Swing 术语来说,这将是 JButton、JTextField、JLabel 等。

因此,如果您要创建自定义组件,则可以设置大小。如果您只是使用一个组件作为带有布局管理器的容器来容纳其他组件,那么您就不会计算大小。

关于Java Swing - 可滚动面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41247903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com