Search code examples
javaswingjbuttongridbaglayoutdimensions

Resizing a JButton


I was wondering how I can resize the 'alarmClockButton' in my code, I've tried setSize(); and setPreferredSize(); however they both don't work. I am using the GridBagLayout for this. Any ideas?

 public class MainMenu {

    // JFrame = the actual menu / frame.
    private JFrame frame;
    // JLabel = provides text instructions or information on a GUI —
    // display a single line of read-only text, an image or both text and an image.
    private JLabel background, logo;
    // JButton = button.
    private JButton alarmClockButton;

    // Constructor to create menu
    public MainMenu() {
        frame = new JFrame("Alarm Clock");
        alarmClockButton = new JButton("Timer");
        alarmClockButton.setPreferredSize(new Dimension(1000, 1000));
        // Add an event to clicking the button.
        alarmClockButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // TODO: CHANGE TO SOMETHING NICER
                JOptionPane.showMessageDialog(null, "This feature hasn't been implemented yet.", "We're sorry!",
                        JOptionPane.ERROR_MESSAGE);
            }
        });
        // Creating the background
        try {
            background = new JLabel(new ImageIcon(ImageIO.read(getClass()
                    .getResourceAsStream("/me/devy/alarm/clock/resources/background.jpg"))));
            logo = new JLabel(new ImageIcon(ImageIO.read(getClass()
            .getResourceAsStream("/me/devy/alarm/clock/resources/logo.png"))));
        } catch (IOException e) {
            e.printStackTrace();
        }
        background.setLayout(new GridBagLayout());
        frame.setContentPane(background);
        GridBagConstraints gbc = new GridBagConstraints();
        // Inset = spacing between each component
        gbc.insets = new Insets(15,15, 15, 15);
        // Positioning
        gbc.gridx = 0;
        gbc.gridy = 0;
        frame.add(logo, gbc);
        // Positioning
        // Keep x the same = aligned. On same x-coordinate (think math!)
        gbc.gridx = 0;
        // Y = 2 down
        gbc.gridy = 1;
        frame.add(alarmClockButton, gbc);
        frame.setVisible(true);
        frame.setSize(550, 200);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        alarmClockButton.setForeground(Color.RED);
    }

}

Thanks!


Solution

  • You can effect the size of the button through the GridBagConstraints, for example...

    Using ipadx and ipady, which add to the components preferredSize

    gbc.ipadx = 100;
    gbc.ipady = 100;
    

    Produces something like...

    enter image description here

    You can also use...

    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH;
    

    which changes the amount of space which the component will occupy and how the component is filled within it's given cell...

    Clock

    Note:

    Because you're using a JLabel as your background component, you will be limited to the the label's preferred size, which is calculated through the icon and text properties only, it won't use the layout manager to calculate these results.