Giving a JPanel a percentage-based width

后端 未结 3 514
猫巷女王i
猫巷女王i 2021-01-14 08:27

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

3条回答
  •  无人及你
    2021-01-14 09:00

    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);
      }
    }
    

提交回复
热议问题