Java - jList: пользовательский вопрос ListSelectionListener (включая SSCCE) - PullRequest
0 голосов
/ 24 июня 2010

Я пытаюсь установить некоторые действия для пользовательского 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());
    }

}

Действие, которое я вызываю, работает, и нет ошибок при компиляции.Но на самом деле ничего не происходит.

Я знаю, что я не включаю в этот код больше деталей, я просто хочу спросить, не делаю ли я логическую ошибку в этом событии.

Заранее спасибо!

EDIT: добавлены действие и инициализация 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());

EDIT 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 голосов
/ 24 июня 2010

Так что именно вы пытаетесь сделать?

Если вы пытаетесь установить цвет выбранной строки, то этот код должен быть выполнен в рендерере. В общем, когда вы играете с цветами в рендере, вам нужен чек:

if (! isSelected)
    //  do you custom rendering

Таким образом, строка будет отображать подсветку по умолчанию при выборе разных строк.

И, конечно, SSCCE все еще следует публиковать, потому что мы понятия не имеем, что пытается сделать ваше пользовательское действие, и поэтому не можем вносить никаких реальных предложений.

Отредактировано:

Он ничего не делает, потому что весь ваш код создает Action. Если вы хотите вызвать Action, тогда код должен выглядеть примерно так:

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

В действительности нет необходимости создавать настоящее Действие, вам просто нужно вызвать какой-то метод, который напрямую выполняет то, что вы хотите. Причина, по которой вы создаете действие, заключается в том, что вы хотите добавить Actdion в JButton или JMenuItem, чтобы пользователь мог щелкнуть по компоненту, чтобы вызвать действие.

...