コンポーネントを垂直に配置するのに役立つレイアウトマネージャー(またはレイアウトマネージャーのセット)を探しています。すべてのコンポーネント(ボタン)は同じ幅で、下にあるダイアログクライアント領域の幅で縁取られている必要があります。これらの各ボタンは、接続されているJLabelに応じて高さを拡張できます(ユーザーが関連するボタンをクリックするとラベルが表示されます)-要するに、すべてのコンポーネントは同じ固定幅に引き伸ばされる必要がありますが、可変ですコンテンツに応じた高さ。必要に応じて、垂直スクロールバーをサポートするために、ダイアログコンテンツ全体をJScrollPane内に配置する必要があります。
私は、目的の動作を実装するために、さまざまなレイアウトマネージャー(主に水平方向のストレッチ用のborderlayoutと垂直方向の配置用のboxlayout)を積み重ねたところです。しかし、それは満足のいくコードではなく、私が望むように完全に機能するわけでもありません。
私はこの問題のためにインターネットをサーフィンすることに多くの時間を費やし、垂直レイアウトがJavaで一般的な問題であることを発見しました。多くの人がGridBagLayoutがこの仕事をするのに最適なレイアウトだと答えましたが、私はそれを私が望むように動作させることができませんでした。
それが私にその問題の助けを与えるのに十分な情報であることを願っています。
よろしくマイケル
編集:-もう必要ありません-
編集2:
これが私の現在の試みの画像です: http ://www.pic-upload.de/view-16978954/example-image.png.html
これはほとんど私が望む結果ですが、サイズ変更には奇妙な振る舞いがあります。
編集3:
私の主な問題は、JLabelを含むhtmlと組み合わせたJScrollPaneだと思います。setMaximumSize(...)のようなものが必要ですが、正常に機能しません: http ://www.pic-upload.de/view- 16988005 / example-image3.png.html
固定幅が必要ですが、設定方法がわかりません。
setPreferredSize(...)は機能しますが、HTMLテキストが含まれているため、JLabelの高さがわかりません。
編集4:
私のボタン:
public class Expander extends JPanel implements ActionListener {
private static class HtmlViewer extends JLabel {
private static final long serialVersionUID = 8787130155299083869L;
public HtmlViewer(String doc) {
super(doc);
this.setBackground(Color.WHITE);
this.setOpaque(true);
}
}
private static final long serialVersionUID = 4480221797736558685L;
JToggleButton button;
JComponent component;
public Expander(String text, String doc) {
this(text, new HtmlViewer(doc));
}
public Expander(String text, JComponent expandableComponent) {
this.setLayout(new BorderLayout());
button = new JToggleButton(text) {
private static final long serialVersionUID = -3330376265192275758L;
@Override
public void paint(Graphics g) {
super.paint(g);
if (this.isSelected()) {
g.drawString("▼", this.getWidth() - 20, 15);
} else {
g.drawString("■", this.getWidth() - 20, 15);
}
}
};
button.setFocusPainted(false);
button.addActionListener(this);
component = expandableComponent;
component.setBorder(new EmptyBorder(5, 5, 5, 5));
this.add(button, BorderLayout.PAGE_START);
}
@Override
public void actionPerformed(ActionEvent e) {
if (button.isSelected()) {
this.add(component);
} else {
this.remove(component);
}
this.getTopLevelAncestor().validate();
this.getTopLevelAncestor().repaint();
this.setMaximumSize(this.getPreferredSize());
}
}
フレーム:
public class grid2 {
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel();
JScrollPane scroll = new JScrollPane(p, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
addStuff(p);
frame.add(scroll);
frame.pack();
frame.setVisible(true);
}
public static void addStuff(Container container) {
container.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1;
c.weighty = 0;
Expander e = new Expander("test", "<html>fgb fdh fgfhg ifghiufdshfidsghfiufdsghiudsfhdsfiu dshiufhds if dhf idsufhdsiufhiufhiuds hfdshfiudshfuidsifudshfiudshf ufdhfiushdfiudshiufhdsiufhdsiuf udshfiudshfiudshfudshf iuhfiudshfiudshfiudshf</html>"); // long html text example
e.setMaximumSize(new Dimension(500, 10000));
c.gridx = 0;
c.gridy = 0;
c.gridwidth = GridBagConstraints.REMAINDER;
container.add(e, c);
JButton button2 = new JButton("Button 2");
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
container.add(button2, c);
c.gridy = 2;
c.weighty = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
container.add(new JLabel(), c);
}
}