0

我正在尝试在自定义 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());
    }

}

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

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

提前致谢!

编辑:添加了动作和 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 的确切问题。

4

1 回答 1

0

那么你到底想做什么?

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

if (! isSelected)
    //  do you custom rendering

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

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

编辑:

它没有做任何事情,因为您的所有代码都在创建 Action。如果你想调用 Action 那么代码应该是这样的:

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

实际上,不需要创建实际的 Action,您只需要直接调用一些方法来执行您想要的操作。创建 Action 的原因是如果您想将 Actdion 添加到 JButton 或 JMenuItem 以便用户可以单击组件来调用 Action。

于 2010-06-24T14:12:37.150 回答