0

所以我有一个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);

我有一个关于按钮点击事件的虚拟程序

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());
    }
}
4

1 回答 1

1

所以我想出了一种方法,而不是使用包含 JLabel 和 JButton 的 JList。我只是使用了一个 JTable,第一列是标签,第二列是一个复选框(在我的情况下,我需要一些东西来打开\关闭列表中的某些东西)。

有了那个 JTable,我需要 OnColumnClick 事件和 OnRowClick 事件。为了能够多次调用同一个按钮,我只需在 OnColumnClick 中选择同一行的另一列。

于 2012-11-13T21:26:37.957 回答