import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public final class MagnifierTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(MagnifierTest::createUI);
    }

    private static final Rectangle[] DATA = {
            new Rectangle(0, 0, 10, 10),
            new Rectangle(30, 30, 20, 20),
            new Rectangle(100, 100, 200, 200),
            new Rectangle(300, 300, 400, 400)
    };

    private static final class ListWidthRenderer extends DefaultListCellRenderer {
        @Override
        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JLabel renderer = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            renderer.setText(Integer.toString(((Rectangle) value).width));
            return renderer;
        }
    }

    private static void createUI() {
        JList<Rectangle> simpleList = new JList<>(DATA);
        JComboBox<Rectangle> simpleCombo = new JComboBox<>(DATA);

        JPanel simple = new JPanel(new GridLayout(1, 2));
        simple.setBorder(BorderFactory.createTitledBorder("Simple:"));
        simple.add(simpleList);
        simple.add(simpleCombo);

        JList<Rectangle> customList = new JList<>(DATA);
        customList.setCellRenderer(new ListWidthRenderer());
        JComboBox<Rectangle> customCombo = new JComboBox<>(DATA);
        customCombo.setRenderer(new ListWidthRenderer());

        JPanel custom = new JPanel(new GridLayout(1, 2));
        custom.setBorder(BorderFactory.createTitledBorder("Custom:"));
        custom.add(customList);
        custom.add(customCombo);

        JComponent main = Box.createVerticalBox();
        main.add(simple);
        main.add(custom);

        JFrame frame = new JFrame("Magnifier test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(main);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
