How to capture buttonClick event in JList defaultListModel ? And also how to customise width of jbutton inside defaultListModel "Capture it's click !"

Viewed 31

Here is a sample code for the same, the button "Capture it's click !" is inside defaultListModel and a click on this is percieved as click on list element, however I need this click as button click event. And is there any way to reduce the width of this button. Currently width is same as list element.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JListTest {
    private JList list;
    private DefaultListModel dataModel;
    private JPanel panel = new JPanel();

    public JListTest() {
        dataModel = new DefaultListModel();
        list = new JList<>(dataModel);
        list.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("mouse event==" + me);
                    }
                });
            }
        });
        list.setCellRenderer(new PanelRenderer());

    }

    public static void main(String[] args) {
        JListTest test = new JListTest();
        test.dataModel.addElement("Lable 1");
        test.dataModel.addElement(createButton("Capture it's click !"));
        test.dataModel.addElement("Lable 3");

        JButton button1 = new JButton("Button 1");
        JButton button2 = new JButton("Button 2");
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(" button 1 clieck");
            }
        });
        test.panel.add(button1);
        test.panel.add(button2);
        test.dataModel.addElement(test.panel);
        test.showUi();
    }

    public void showUi() {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("Demo list");
        frame.setAlwaysOnTop(true);
        frame.setType(Window.Type.UTILITY);
        frame.setResizable(true);
        frame.getContentPane().setLayout(new BorderLayout());
        JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setPreferredSize(new Dimension(400, 250));
        frame.getContentPane().add(scrollPane, BorderLayout.NORTH);
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    class PanelRenderer implements ListCellRenderer {

        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

            if (value instanceof JButton) {
                ((JButton) value).setBackground(isSelected ? Color.GRAY : list.getBackground());

                int listSize = list.getModel().getSize();
                if (listSize > 10 && index < listSize - 4) {
                    if (list.getModel().getElementAt(index) instanceof JButton) {
                        ((JButton) list.getModel().getElementAt(index)).setEnabled(false);
                    }
                }
            }
            if (value instanceof String) {
                return new DefaultListCellRenderer().getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            }

            return (Component) value;
        }
    }

    public static JButton createButton(String text) {
        JButton button = new JButton(text);
        button.setBounds(80, 30, 10, 40);
        // button.setPreferredSize(new Dimension(20,20));
        return button;
    }
}
0 Answers
Related