我正在尝试在自定义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的确切问题。
答案 0 :(得分:0)
那你到底想要做什么?
如果您尝试设置已选择的行的颜色,则应在渲染器中完成该代码。通常,无论何时在渲染器中使用颜色,都需要进行检查:
if (! isSelected)
// do you custom rendering
这样,当您选择不同的行时,该行仍将显示默认突出显示。
当然,仍然应该发布SSCCE,因为我们不知道您的自定义操作正在尝试做什么,因此无法提出任何真正的建议。
编辑:
它没有做任何事情,因为您的所有代码都在创建Action。如果要调用Action,则代码应为:
new Actions().createTestAction().actionPerformed(null);
实际上没有必要创建一个实际的Action,你只需要直接调用一些你想要的方法。您创建Action的原因是,如果您想将Actdion添加到JButton或JMenuItem,那么用户可以单击该组件来调用Action。