Java - jList:自定义ListSelectionListener问题(包含SSCCE)

时间:2010-06-24 13:56:51

标签: java listener jlist

我正在尝试在自定义ListSelectionListener上设置一些操作,虽然当我实际选择jList的一个组件时,一切都编译得很好,但是它不起作用。

以下是代码段:

public class ListSelectionHandler implements ListSelectionListener
{
    ListCustomObject o;

    @Override
    public void valueChanged(ListSelectionEvent e)
    {
            o = (ListCustomObject) app.MainWindow.jList1.getModel()
                    .getElementAt(e.getFirstIndex());

            new app.actions.Actions().createSetEdgeColorTo(o.getColor());
    }

}

我正在调用的操作正在运行,编译时没有错误。但事实上并没有发生。

我知道我在这段代码中没有包含太多细节,我只是想问一下我是否在这个事件中犯了一个逻辑错误。

提前致谢!

编辑:添加了Action和JList初始化:

    public Action createSetEdgeColorTo(Color color)
    {
        return new SetEdgeColorTo(color);
    }

    class SetEdgeColorTo extends AbstractAction
    {

        Color color;

        SetEdgeColorTo(Color color)
        {

            super("Set new Edge Color");
            this.color = color;
        }

        @Override
        public void actionPerformed(ActionEvent evt)
        {
            app.graph.GraphEdit.view.getGraph2D().getDefaultEdgeRealizer()
                                                 .setLineColor(color);
            app.graph.GraphEdit.view.getGraph2D().updateViews();
        }
    }

JList jList1 = new javax.swing.JList();
ListSelectionModel listSelectionModel = jList1.getSelectionModel();
listSelectionModel.addListSelectionListener(new app.jlist
                                             .ListSelectionHandler());

编辑3:重做 SSCCE

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.Action;
import javax.swing.JFrame;

public class SSCCE
{

    static JList jList1;

    public static void main(String[] args)
    {

        JFrame frame = new JFrame();
        jList1 = new JList();
        ListSelectionModel listSelectionModel = jList1.getSelectionModel();
        listSelectionModel.addListSelectionListener(
                new ListSelectionHandler());
        DefaultListModel listModel = new DefaultListModel();
        jList1.setModel(listModel);
        listModel.addElement("String");
        listModel.addElement("String two");

        frame = new JFrame();
        frame.setDefaultCloseOperation(1);
        frame.add(jList1);
        frame.pack();
        frame.setVisible(true);

    }
}

class ListSelectionHandler implements ListSelectionListener
{
    @Override
    public void valueChanged(ListSelectionEvent e)
    {

        System.out.println("" + e.getFirstIndex());
        new Actions().createTestAction();
    }
}

class Actions
{

    public Action createTestAction()
    {
        return new TestAction();
    }

    class TestAction extends AbstractAction
    {

        TestAction()
        {
            super("Test Action");
        }

        @Override
        public void actionPerformed(ActionEvent evt)
        {
            System.out.println("Test Action Fired!");
        }
    }
}

此SSCCE描述了再次未触发的示例TestAction的确切问题。

1 个答案:

答案 0 :(得分:0)

那你到底想要做什么?

如果您尝试设置已选择的行的颜色,则应在渲染器中完成该代码。通常,无论何时在渲染器中使用颜色,都需要进行检查:

if (! isSelected)
    //  do you custom rendering

这样,当您选择不同的行时,该行仍将显示默认突出显示。

当然,仍然应该发布SSCCE,因为我们不知道您的自定义操作正在尝试做什么,因此无法提出任何真正的建议。

编辑:

它没有做任何事情,因为您的所有代码都在创建Action。如果要调用Action,则代码应为:

new Actions().createTestAction().actionPerformed(null);

实际上没有必要创建一个实际的Action,你只需要直接调用一些你想要的方法。您创建Action的原因是,如果您想将Actdion添加到JButton或JMenuItem,那么用户可以单击该组件来调用Action。