所以我有一个JList,每行是一个JButton,后跟一个jLabel。我需要做的是当我点击它调用一个函数的按钮时,但是现在无论我点击该行,它都会调用另一个函数。
问题在于它是在listselectionlistener的函数内部。所以从不调用按钮监听器。我试图删除列表监听器,只有一个按钮,它不起作用。我想也许在列表的监听器中,我可以验证点击完成的位置,但我不认为这是正确的做法。
有什么想法吗?
以下是我如何定义我的课程
public class SelectScheduleUI extends JPanel implements ListCellRenderer<JPanel>, ListSelectionListener, ActionListener
这是我创建部分框架时的代码。
m_Schedules = new DefaultListModel<JPanel>();
m_SchedulesList = new JList<JPanel>(m_Schedules);
m_SchedulesList.addListSelectionListener(this);
以后我添加列表中的每个元素。
JPanel schedulePanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
JButton enabledLabel = new JButton();
enabledLabel.setBounds(0, 0, ICON_WIDTH, ICON_HEIGHT);
enabledLabel.setBorder(null);
enabledLabel.addActionListener((ActionListener) this);
schedulePanel.add(enabledLabel, c, LABEL_ICON);
JLabel label = new JLabel();
label.setText(p_SchedulerName);
label.setBounds(0, 0, LABEL_NAME_WIDTH, ICON_HEIGHT);
schedulePanel.add(label, c, LABEL_NAME);
m_Schedules.addElement(schedulePanel);
我有on按钮点击事件的虚拟程序
public void actionPerformed(ActionEvent e)
{
//Execute when button is pressed
System.out.println("You clicked the button");
}
这是列表的监听器
@Override
public void valueChanged(ListSelectionEvent e)
{
if(e.getValueIsAdjusting() == false)
{
//if the user didn't select anything, or is in the
// process of selecting multiple items, don't update
if(m_SchedulesList.getSelectedIndex() == -1 ||
m_SchedulesList.getSelectedIndices().length > 1)
{
return;
}
m_Selector.onScheduleSelect(m_Schedules.get(m_SchedulesList.getSelectedIndex()).getName());
}
}
答案 0 :(得分:1)
所以我想出了一种方法,而不是使用包含JLabel和JButton的JList。我只使用了一个JTable,第一列是标签,第二列是一个复选框(在我的情况下,我需要一些东西来打开\列表中的东西)。
使用JTable我需要OnColumnClick事件和OnRowClick事件。为了能够多次调用同一个按钮,我只需在OnColumnClick中选择同一行的另一列。