我有一个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,它将按预期工作。如果您随后使用向下箭头键在某些时候键入其他一些单元格,则所选内容将跳至先前选择的单元格,而我无法找出导致这种跳转的原因的任何方法,更不用说阻止它了。 >
答案 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()
来确定类名的用法很奇怪,因为Handler
是BasicListUI
中的私有类,因此我们不能使用instanceof
。
不用说,这些恶作剧使得代码有些脆弱。如果您希望使用这种方法,请确保记录正确并准备在迁移到将来的Java版本时对其进行修复。
如果您发现自己在与这样的组件设计抗争,则可能是使用了错误的组件。也许您最好使用单列JTable
。