import javax.swing.JFrame;
import javax.swing.JCheckBox;
import javax.swing.SwingUtilities;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.BorderLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.lang.reflect.InvocationTargetException;

public class ButtonFocus implements FocusListener {

    public JFrame createUI() throws InterruptedException, InvocationTargetException {
        JFrame frame = new JFrame("Paint Border bug");
        JButton firstButton = new JButton("First");
        JButton secondButton = new JButton("Second");
        JButton thirdButton = new JButton("Three");
        JCheckBox borderPaintCheckBox = new JCheckBox("Button Border Painted" , true);

        SwingUtilities.invokeAndWait(()->{

            firstButton.addFocusListener(this);
            secondButton.addFocusListener(this);
            thirdButton.addFocusListener(this);

            borderPaintCheckBox.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    boolean state = borderPaintCheckBox.isSelected();
                    firstButton.setBorderPainted(state);
                    secondButton.setBorderPainted(state);
                    thirdButton.setBorderPainted(state);
                }
            });

            frame.setLayout(new BorderLayout());
            frame.getContentPane().add(borderPaintCheckBox, BorderLayout.CENTER);

            JPanel panel = new JPanel();
            panel.add(firstButton);
            panel.add(secondButton);
            panel.add(thirdButton);
            frame.getContentPane().add(panel,BorderLayout.SOUTH);
           // frame.setSize(200, 200);
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
        return frame;
    }

    public static void main(String []args) throws InterruptedException, InvocationTargetException {
        ButtonFocus buttonFocus = new ButtonFocus();
        final JFrame frame[] = new JFrame[1];
        try {
            frame[0] = buttonFocus.createUI();
        }finally {
            SwingUtilities.invokeAndWait(()->{
                if ( frame[0] != null ) {
                   // frame[0].dispose();
                }
            });
        }
    }

    @Override
    public void focusGained(FocusEvent e) {
        System.out.println(e.toString());
    }

    @Override
    public void focusLost(FocusEvent e) {
        System.out.println(e.toString());
    }
}

