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は引き続き投稿する必要があります。これは、カスタムアクションが何をしようとしているのかわからないため、実際の提案を行うことができないためです。

編集:

コードが実行しているのはアクションの作成だけなので、何も実行されません。アクションを呼び出す場合、コードは次のようになります。

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

実際には、実際のアクションを作成する必要はありません。必要なことを実行するメソッドを直接呼び出す必要があります。アクションを作成する理由は、ユーザーがコンポーネントをクリックしてアクションを呼び出すことができるように、ActdionをJButtonまたはJMenuItemに追加する場合です。

于 2010-06-24T14:12:37.150 に答える