如果单击JList上的选定索引,我希望它取消选择.换句话说,点击索引实际上切换了他们的选择.看起来不支持,所以我试过了
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
list.removeSelectionInterval(index, index);
}
});
Run Code Online (Sandbox Code Playgroud)
这里的问题是在 JList已经对鼠标事件起作用之后调用它,因此它取消选择所有内容.然后,我尝试删除所有JList的MouseListeners,添加我自己的,然后添加所有默认侦听器.这不起作用,因为在我取消选择后,JList会重新选择索引.无论如何,我最终想出的是
MouseListener[] mls = list.getMouseListeners();
for (MouseListener ml : mls)
list.removeMouseListener(ml);
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
final int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
list.removeSelectionInterval(index, index);
}
});
}
});
for (MouseListener ml : mls)
list.addMouseListener(ml);
Run Code Online (Sandbox Code Playgroud)
......那很有效.但我不喜欢它.有没有更好的办法?
parserChar :: Char -> Parser Char
parserChar c = Parser ch where
ch d = case dvChar d of
Parsed c dp -> Parsed c dp
_ -> NoParse
Run Code Online (Sandbox Code Playgroud)
上面的函数应该采用Char c并返回一个只匹配的Parser c.该函数dvChar d将返回Parsed char dp或NoParse(char字符串中的下一个字符).因此,我曾希望Parsed c dp只匹配一个结果char==c,但实际发生的是该函数返回的Parser匹配任何字符(即使c似乎绑定到某个特定的Char,作为函数参数).
以下功能正常工作:
parserChar :: Char -> Parser Char
parserChar c = Parser ch where
ch d = case dvChar d of
Parsed char dp -> if …Run Code Online (Sandbox Code Playgroud)