ボタン (X)、ラベル (Y)、進行状況バー (Z) で構成されるパネルがあります。理想的には、次のようにレイアウトしたいと思います。
| X-X Y---------------Y Z---Z ============= | <-- expanded-size panel
^ extra space
| X-X Y------Y Z---Z | <-- reduced-size panel
上の図は、次のことを示しています。
- パネルが拡張されると、ラベルがテキストを完全に表示できるように、余分なスペースをラベル (Y) に配置する必要があります。
- プログレス バー (Z) は常にラベル (Y) の横にある必要があります。
- パネルを縮小する場合は、ラベル (Y) のサイズを縮小する必要があります。
- ボタン (X) とプログレス バー (Z) のサイズは、ラベル (Y) のサイズではなく、一定にする必要があります。
ただし、GroupLayout を使用しようとすると、パネルが展開されると次のようになります。
| X-X Y---------------Y ============= Z---Z | <-- expanded-size panel (bad)
問題は、パネルに余分なスペースがある場合、ラベル (Y) が必要以上に拡張され、プログレス バー (Z) が右に押し出されることです。プログレス バー (Z) の位置がラベル (Y) の隣にあることをお勧めします。
このレイアウトを実現するにはどうすればよいですか?
コード例 (「Blah.java」):
import java.awt.*;
import javax.swing.*;
public class Blah extends JPanel {
public Blah() {
final JButton X = new JButton("X");
final JLabel Y = new JLabel("yyyyyyyyyyy");
Y.setOpaque(true);
Y.setBackground(Color.YELLOW);
final JProgressBar Z = new JProgressBar();
Z.setIndeterminate(true);
final GroupLayout l = new GroupLayout(this);
super.setLayout(l);
l.setHorizontalGroup(
l.createSequentialGroup()
.addComponent(X, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(Y, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(Z, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE));
l.setVerticalGroup(
l.createParallelGroup()
.addComponent(X)
.addComponent(Y)
.addComponent(Z));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
final JFrame frame = new JFrame("Blah");
frame.add(new Blah());
frame.pack();
frame.setVisible(true);
}
});
}
}