java actionListener中的按钮和标签列表

时间:2012-10-29 18:02:00

标签: jpanel jbutton jlabel actionlistener jlist

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

1 个答案:

答案 0 :(得分:1)

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

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