スイングを使用してスクロール可能なパネルを作成しようとしています。しかし、私がスイングするのが新しいので、私はそうすることに失敗しています。私のコードでは、jScrollablePaneの中に何も表示されません。Java Swing - スクロール可能なパネル
jframeを作成し、jScrollablePaneを内部に入れました。 というUIElementというクラスを作成しました。これは、コンポーネントセクションと子セクションを含むjPanelに拡張されています。子セクションは他のUIElementで構成されます。
- が前のUIElement下に置かれるべきすべてののUIElement。縦リストのように。
- 子どもは、のコンポーネントの下に置く必要があります。
- チャイルドセクションはスクロールできず、その高さは子UIElementsの高さの合計に固定されます。
- コンポーネントの高さは固定されていますが、幅はコンテナによって延長できますが、
- スペーサーの幅は、スペーサーから除いて40
- に固定する必要があり、すべてのものの幅が動的です。
- UIElementさんは0人以上の子供を持つことができます。
これはいくつかの写真の例ですが、幅は動的です。
そして、ここのコードです:
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);
}
}
https://docs.oracle.com/javase/tutorial/uiswing/layout/problems。html - "fix"という語を検索する – ossobuko
getPreferredSize()メソッドのすべての上書きを消去しました。 – ossobuko
@ossobuko、適切なサイズを定義する必要がある「カスタムコンポーネント」についての私の意見は忘れました。使用しているすべてがJPanelsの場合は、階層の最下部にあるカスタムパネルに適切なサイズが必要です。 BoxLayoutを使用するように見える階層の中間のパネルは、サイズの計算を無効にするべきではありません。 – camickr