Swing を使用している場合は、GridBag レイアウトを使用することを強くお勧めします。他のレイアウトには、多くの要望が残されています。それはすべて好みの問題であり、必要に応じて手動で配置できます。正解はありません。
私が GridBag (または MigLayout - それぞれ独自のもの) を好む理由は、コンポーネントの優先サイズの概念と塗りつぶしの概念があるからです。Swing のコードを作成してからしばらく経ちました (そして、そのように維持しようとします!) が、基本的に次のようなものを探しています。
{
//Pseudo Code, I'd have to go read the API again, I wrote a set of utilities so I wouldn't have to think about it.
GridBagConstraints constraints = ....;
constraints.weightX = 1.0; //fill the area by X
constraints.weightY = 1.0; //fill by Y
constraints.fill = GridBagConstraints.BOTH; //or one...
component.setPreferredSize(image.size());
layout.add(component, constraints);
}
基本的にあなたがしていることは、「私の好みのサイズを最小値として使用する」と言っていますが、これらのルールに基づいて記入してください.
レイアウトを使用しない別の方法は、単にコンポーネントを自分で配置することです (これにはまったく問題はありません)。
{
JPanel panel =...;
panel.setLayout(null);
...
myButton3.setX(0);
myButton3.setY(2 * buttonHeight); //third button
myButton.setSize(myButton.getPreferredSize()); //which I assume you set
...
panel.add(myButton3);
...
}
とにかく選択肢が多い。レイアウトを使用する必要があるとは思わないでください。独自のレイアウトを作成してください。これらのことを気にかけ、それを機能させる必要がありますが、苦しむべきではありません。一般に、レイアウトは実装が非常に簡単であり、これを回避することを恐れてはなりません。
とは言っても、GridBag はあなたのやりたいことをやってくれます。または、Mig は優れており、優れた GUI エディターがいくつかあります。
更新 -> ------------------------------- ここに簡潔な例があります -- 私は心からこのスタイルのプログラミングを推奨しません。この例では、クラスのスパムが欲しくありませんでした。
package _tests;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class Grids extends JFrame
{
private static final long serialVersionUID = 1L;
public static void main(String ... args)
{
new Grids().setVisible(true);
}
public Grids()
{
//Null layout example
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(250, 300);
setMinimumSize(new Dimension(285, 300)); //Windows 8 ~ border size + scrollbar
setTitle("Test layouts");
JPanel scrollTarget = new JPanel()
{
private static final long serialVersionUID = 1L;
{
setSize(250, 1000);
setPreferredSize(new Dimension(250, 1000));
//setLayout(null); -- uncomment for absolute
setLayout(new GridBagLayout());
int lastX = 0;
int lastY = 0;
for(int i = 0; i < 5; i++)
{
final String label = "Button " + i;
JButton tmp = new JButton()
{
private static final long serialVersionUID = 1L;
{
setText(label);
setPreferredSize(new Dimension(250, 200)); //Preferred
}
};
tmp.setSize(tmp.getPreferredSize()); //What you're layout usually does..
//add(tmp);
//tmp.setLocation(lastX, lastY);
//lastY += tmp.getHeight();
add(tmp, getButtonConstraint(0, i));
}
}
};
add(new JScrollPane(scrollTarget));
}
private GridBagConstraints getButtonConstraint(int x, int y)
{
GridBagConstraints tmp = new GridBagConstraints();
tmp.fill = GridBagConstraints.BOTH;
tmp.weightx = 1.0;
tmp.weighty = 1.0;
tmp.gridx = x;
tmp.gridy = y;
tmp.anchor = GridBagConstraints.NORTHEAST;
return tmp;
}
}