What\'s the easiest way to make a JPanel
that takes up a fixed percentage of its parent container, by width?
Its width should update when that of its pa
Another option is to use a SpringLayout
:
import java.awt.*;
import javax.swing.*;
public class SpringLayoutTest {
private JComponent makeUI() {
SpringLayout layout = new SpringLayout();
JPanel p = new JPanel(layout);
p.setBorder(BorderFactory.createLineBorder(Color.GREEN, 10));
Spring pw = layout.getConstraint(SpringLayout.WIDTH, p);
Spring ph = layout.getConstraint(SpringLayout.HEIGHT, p);
JLabel l = new JLabel("label: 5%, 5%, 90%, 55%", SwingConstants.CENTER);
l.setOpaque(true);
l.setBackground(Color.ORANGE);
l.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
JButton b = new JButton("button: 50%, 65%, 40%, 30%");
setPercentage(layout.getConstraints(l), pw, ph, .05f, .05f, .90f, .55f);
setPercentage(layout.getConstraints(b), pw, ph, .50f, .65f, .40f, .30f);
p.add(l);
p.add(b);
return p;
}
private static void setPercentage(
SpringLayout.Constraints c, Spring pw, Spring ph,
float sx, float sy, float sw, float sh) {
c.setX(Spring.scale(pw, sx));
c.setY(Spring.scale(ph, sy));
c.setWidth(Spring.scale(pw, sw));
c.setHeight(Spring.scale(ph, sh));
}
public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new SpringLayoutTest().makeUI());
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}