Search code examples
javaswingmiglayout

MigLayout have two buttons align with component


import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.WindowEvent; 
import java.awt.event.WindowListener;

import javax.swing.JButton; 
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

import net.miginfocom.swing.*;

public class Main{

private JFrame frame = new JFrame("Super Simple");
private JPanel panel1 = new JPanel(); //calendar of month

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try{
                Main m = new Main();
                m.monthScreen();
            } catch (Exception e){

            }
        }
    });
}

public Main(){
    panel1.setLayout(new MigLayout("", "[14.2%][14.2%][14.2%][14.2%][14.2%][14.2%][14.2%]", 
            "[12.5%][12.5%][12.5%][12.5%][12.5%][12.5%][12.5%][12.5%]"));
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension d = tk.getScreenSize();
    frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); //tells the window listener to handle closing
    frame.addWindowListener(new WindowListener(){

        @Override
        public void windowActivated(WindowEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void windowClosed(WindowEvent arg0) {
        }

        @Override
        public void windowClosing(WindowEvent arg0) {
            System.out.println("Closing!");
            System.exit(0);
        }

        @Override
        public void windowDeactivated(WindowEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void windowDeiconified(WindowEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void windowIconified(WindowEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void windowOpened(WindowEvent arg0) {
            // TODO Auto-generated method stub

        }

    });
    frame.getContentPane().add(panel1);
    frame.setBounds(100, 100, (int)(d.width/1.5), (int)(d.height/1.3)); // roughly 75% size of screen on opening
    d.setSize(600, 600); //minimum that the screen can resized to.
    frame.setMinimumSize(d);
    JMenuBar menuBar;
    JMenu menu;
    menuBar = new JMenuBar();
    menu = new JMenu("A Menu");
    menuBar.add(menu);
    frame.setJMenuBar(menuBar);
    frame.setVisible(true); 
}

public void monthScreen(){
    JButton buttonLeft = new JButton();
    JButton buttonRight = new JButton();
    Dimension d = new Dimension();
    d.setSize(20, 20);
    buttonLeft.setMinimumSize(d);
    buttonLeft.setMaximumSize(d);
    buttonRight.setMinimumSize(d);
    buttonRight.setMaximumSize(d);
    JLabel label = new JLabel("Example");
    try { //in case they don't have the font, use the systems default font
    Font tr = new Font("Impact", Font.PLAIN, 18);
    label.setFont(tr);
    } catch (Exception e){
        Font defaultFont = new JLabel().getFont();
        Font tr = new Font(defaultFont.toString(), Font.PLAIN, 18);
        label.setFont(tr);
    }
    panel1.add(label, "cell 0 1, span, align 50% 0%, id label");
    panel1.add(buttonLeft, "id bl, cell 0 1");
    panel1.add(buttonRight, "id br, cell 0 1");
    }
}

I'm trying to get buttonLeft and buttonRight to align with the center of the example text, and to stay aligned when the screen is resized, like this:

example where buttons should be, note they aren't actually there in the program

Can anyone who knows how to use MigLayout help? Thanks


Solution

  • You can nest components with different layouts. Here a possible solution with the use of FlowLayout and MigLayout:

        public void monthScreen() {
        JButton buttonLeft = new JButton();
        buttonLeft.setPreferredSize(new Dimension(20, 20)); // for correct size
        JButton buttonRight = new JButton();
        buttonRight.setPreferredSize(new Dimension(20, 20)); // for correct size
        Dimension d = new Dimension();
        d.setSize(20, 20);
        buttonLeft.setMinimumSize(d);
        buttonLeft.setMaximumSize(d);
        buttonRight.setMinimumSize(d);
        buttonRight.setMaximumSize(d);
        JLabel label = new JLabel("Example");
        JPanel panel = new JPanel(); // add components here
        FlowLayout fl = new FlowLayout();
        fl.setHgap(0); // for some space/insets if u want
        fl.setVgap(0); // for some space/insets if u want
        panel.setLayout(fl);
        panel.add(buttonLeft);
        panel.add(label);
        panel.add(buttonRight);
        try { // in case they don't have the font, use the systems default font
            Font tr = new Font("Impact", Font.PLAIN, 18);
            label.setFont(tr);
        } catch (Exception e) {
            Font defaultFont = new JLabel().getFont();
            Font tr = new Font(defaultFont.toString(), Font.PLAIN, 18);
            label.setFont(tr);
        }
        panel1.add(panel, "cell 0 1, span, align 50% 0%, id label"); // Dont forget to add the new panel
        // panel1.add(buttonLeft, "id bl, cell 0 1");
        // panel1.add(buttonRight, "id br, cell 0 1");
    }