gpt4 book ai didi

java - 我可以在不向监听器抛出事件的情况下为 JList 设置所选项目吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:58:13 24 4
gpt4 key购买 nike

我正在开发一个查看器,它使用 JList 来显示文档页面的缩略图。用户可以通过在 JList 中选择页面或通过其他机制(例如在文本框中输入数字)来打开页面。

当使用后一种选择时,我希望 JList 也选择页面。我使用 setSelectedIndex() 执行此操作,但这会触发一个事件,导致页面再次加载,就好像用户单击并选择了 JList 中的页面一样,这给我带来了一些问题。

我怎么看,应该以某种方式设置索引(可能在模型中),以便只有 JList 的 UI 更新,而不会触发索引已更改的事件。

这可能吗?还是有更好的方法来解决我的问题?

最佳答案

  1. 您可以从列表中删除所有 ListSelectionListener,进行选择,然后再次添加它们。

  2. 您可以使用不抛出事件的方法创建您自己的 ListSelectionModel,并将其设置为您的 JList 的选择模型,然后使用getSelectionModel().yourSelectIndexMethod(index)

  3. 您也可以将其他的选择方式都转移到列表中,如果通过其他方式选择页面,只需找到相应的条目,然后选择列表中的项目即可。通过这种方式,项目被选中并且页面被加载一次。

选项 2 的代码:

public class ListTest extends JPanel{

private static final String[] items = new String[]{"1", "2", "3"};
private JList mylist;
private JComboBox myCombo;
private JTextArea myTA;

public ListTest() {
setLayout(new BorderLayout());
myCombo = new JComboBox(items);
myCombo.addActionListener(new ActionListener(){

@Override
public void actionPerformed(ActionEvent e){
valueSelectedCombo(myCombo.getSelectedIndex());
}
});
JPanel pn = new JPanel();
pn.setLayout(new BoxLayout(pn, BoxLayout.X_AXIS));
pn.add(myCombo);
pn.add(Box.createHorizontalGlue());
pn.add(new JButton(new AbstractAction("Clear"){

@Override
public void actionPerformed(ActionEvent e){
myTA.setText("");
}
}));
add(pn, BorderLayout.NORTH);
add(new JScrollPane(getJList()), BorderLayout.WEST);
add(new JScrollPane(myTA = new JTextArea()), BorderLayout.CENTER);
}

private void valueSelectedList(int index){
myTA.setText(myTA.getText() + "\n" + items[index]);
}

private void valueSelectedCombo(int index){
myTA.setText(myTA.getText() + "\n" + items[index]);
((CustomSelectionModel)mylist.getSelectionModel()).setSelectionSilent(index);
}

private JList getJList(){
if (mylist == null){
mylist = new JList(items);
mylist.setSelectionModel(new CustomSelectionModel());
mylist.addListSelectionListener(new ListSelectionListener(){

@Override
public void valueChanged(ListSelectionEvent e){
if (!e.getValueIsAdjusting()){
valueSelectedList(mylist.getSelectedIndex());
}
}
});

mylist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
mylist.setPreferredSize(new Dimension(100, 106));

}
return mylist;
}

private static class CustomSelectionModel extends DefaultListSelectionModel{

private boolean isSilent = false;

public void setSelectionSilent(int firstIndex){
isSilent = true;
setSelectionInterval(firstIndex, firstIndex);
isSilent = false;
}
protected void fireValueChanged(int firstIndex, int lastIndex, boolean isAdjusting){
if (isSilent){
return;
}
super.fireValueChanged(firstIndex, lastIndex, isAdjusting);
}
}

public static void main(String[] args){
JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Add content to the window.
frame.add(new ListTest());

// Display the window.
frame.pack();
frame.setSize(300, 200);
frame.setVisible(true);
}

}

关于java - 我可以在不向监听器抛出事件的情况下为 JList 设置所选项目吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3092834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com