如何处理列表单元格中按下的按钮

时间:2016-08-04 17:33:13

标签: codenameone

我有一个Destination对象列表和一个类(DestinationsRenderer),它扩展Container并实现ListCellRenderer来呈现列表。列表中的每个单元格都有一个删除按钮,按钮类扩展了Button。

我想要做的是在按下时突出显示删除按钮的边框。我有两个主要问题:

  • 该按钮仅在按下后才会作出反应,但我只需按下该按钮就会做出反应(当它被释放时需要采取不同的行动)
  • 当我选择一个按钮时,列表中的所有按钮都会立即被选中
  • 以上两个我用日志声明验证,但实际边框甚至没有显示

我引用了this之前回答的问题,但这也没有解决第一个问题。

是否可能将列表操作侦听器添加到错误的位置?

以下是渲染器的代码段:

public DestinationsRenderer(final StateMachine stateMachine){

    // other code initializing the buttons and labels
    mDeleteButton.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                if (mList.getSelectedIndex() < mStateMachine.getNumDestinations()) {
                    mIsDeleteSelected = true;
                    mStateMachine.deleteDestination(mList.getSelectedIndex());
                }
            }
    }
}

public Component getListCellRendererComponent(final List list,
                                              final Object value,
                                              final int index,
                                              final boolean isSelected){
    // list of Destinations
    if(mList != null){
        mList.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt){
                if(mIsDeleteSelected){

                    mIsDeleteSelected = false;    // if i take out this line of code, 
                                                  // all of the buttons get highlighted 
                                                  // when i click, 
                                                  // but if i leave it in, none of them do
                    Style style = mDeleteButton.getPressedStyle();
                    style.setBorder(Border.createLineBorder(1, 1416152));
                    mDeleteButton.setPressedStyle(style);
                    mDeleteButton.setUnselectedStyle(style);
                    mDeleteButton.setSelectedStyle(style);
                    mDeleteButton.setDisabledStyle(style);
                } else {
                    Style style = mDeleteButton.getPressedStyle();
                    style.setBorder(Border.createEmpty());
                    mDeleteButton.setPressedStyle(style);
                    mDeleteButton.setUnselectedStyle(style);
                    mDeleteButton.setSelectedStyle(style);
                    mDeleteButton.setDisabledStyle(style);
                }
            }
        });
    }
    mList = list;
    // more code handling other list cell rendering stuff
}

1 个答案:

答案 0 :(得分:1)

不断调用getListCellRendererComponent,将侦听器添加到该方法内的List是错误的。 我建议您更改为Container BoxLayout Y而不是List,处理Container上的按钮和事件会更容易