JList选择随机跳到上一个索引

时间:2019-06-13 18:13:18

标签: java jlist

我有一个JList,我想要在其中导航到不同的单元格,键入文本,然后按“输入”以提交更改。问题是当我更改几个单元格,然后通过向上和向下键进行导航并尝试键入当前选定的单元格时,选择将以某种方式跳至先前填充的单元格。我已经将代码缩减到我认为是解决问题的最低要求:

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("source.html"), "html.parser")

with open("output.csv",'w') as file:
    responsibility=soup.find('table',{'id':'responsibility'})
    lines=responsibility.find_all("tr", class_ = "customer")
    for i in responsibility:
        for line in lines:
            line1=line.next_sibling              #locates tr with title="Role_Name1"
            line2=line.next_sibling.next_sibling #locates tr with title="Role_Name2"
            print(line1)
            print(line2)

如果运行代码并从选择一个单元格并键入内容开始,然后按Enter,它将按预期工作。如果您随后使用向下箭头键在某些时候键入其他一些单元格,则所选内容将跳至先前选择的单元格,而我无法找出导致这种跳转的原因的任何方法,更不用说阻止它了。 >

2 个答案:

答案 0 :(得分:0)

好吧,我通过添加一个int来跟踪该问题,该int跟踪按下键并添加时的选定索引是什么

if(Math.abs(selectedIndex- keyPressedIndex) != 1) {
        serials.setSelectedIndex(keyPressedIndex);
        selectedIndex = serials.getSelectedIndex();
}

ListSelectionListener。还是不知道为什么会发生

答案 1 :(得分:0)

您遇到了JList的功能。发生的情况是,当您键入每个字符时,JList试图滚动到以您键入的字母开头的条目。 因此,如果您输入“ Joe”和“ Dave”,然后尝试键入“ Jerry”,则JList将选择“ Joe”行。

请参阅:Deactivate selection by letter in JList

遵循该问题的技巧:

// Add these lines just before your first "addKeyListener"
for (KeyListener lsnr : serials.getKeyListeners()) {
  if(lsnr.getClass().getSimpleName().equals("Handler")){
    serials.removeKeyListener(lsnr);
  }
}

这些行在您的代码示例中的第47行之前。 杀死JList的自动选择特性有点粗糙。

我们要删除的侦听器在JList方法中由BasicListUI通过installListeners()添加为list.addKeyListener(getHandler())。向BasicListUI咨询来源。 getHandler()返回的类是一个包罗万象的侦听器,它实现了几个不同的侦听器接口,包括KeyListener,这是实现自动选择行为的地方。

使用getSimpleName()来确定类名的用法很奇怪,因为HandlerBasicListUI中的私有类,因此我们不能使用instanceof。 不用说,这些恶作剧使得代码有些脆弱。如果您希望使用这种方法,请确保记录正确并准备在迁移到将来的Java版本时对其进行修复。

如果您发现自己在与这样的组件设计抗争,则可能是使用了错误的组件。也许您最好使用单列JTable