在删除并添加回JPanel后,MouseEvent不会在JList中触发

时间:2012-05-13 02:40:13

标签: java swing jlist

我有两个JList,jltCategories和jltSubcategories,属于同一个JPanel。双击jltCategories会导致jltSubcategories填充相应的子类别,jltSubcategories将从JPanel中删除,添加回来并重新验证。

双击jltSubcategories后,它被删除/添加后不会触发任何内容。然而,如果我打开程序并双击jltSubcategories,它将触发其鼠标事件:如果尚未删除/添加它将触发,但如果已删除/添加它将不会触发。对于jltCategories也是如此:如果我将其删除/添加,它将停止触发。为什么会这样?谢谢!

jltCategories.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() > 1) {
            jbtNavigate.doClick();
        }
    }
});
jltSubcategories.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() > 1) {
            jbtLoad.doClick();
        }
    }
});
jbtNavigate.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        String catName = jltCategories.getSelectedValue();
        try {
            jpLists.remove(jltSubcategories);
            jltSubcategories = new JList<String>(SQL.populateSubcategories(catName));
            jpLists.add(jltSubcategories);
            jpLists.revalidate();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }
});
jbtLoad.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
             System.out.println("Testing Testing 213");
        }
});

1 个答案:

答案 0 :(得分:3)

revalidate() 视图是不够的;您还必须让模型通知视图新数据可用。

DefaultListModel  model = (DefaultListModel ) jltSubcategories.getModel();
model.fireContentsChanged(0, model.getSize());

如果此方法无效,请修改您的问题以包含展示您所描述问题的sscce

附录:目前尚不清楚为什么使用MouseListener来实现更新;使用ListSelectionListener,显示here