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;
}
}