Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修改DefaultListModel中的元素而不更新模型_Java_Swing_Jlist_Jcheckbox_Defaultlistmodel - Fatal编程技术网

Java 修改DefaultListModel中的元素而不更新模型

Java 修改DefaultListModel中的元素而不更新模型,java,swing,jlist,jcheckbox,defaultlistmodel,Java,Swing,Jlist,Jcheckbox,Defaultlistmodel,我有一个JList,它由DefaultListModel支持,并且有一个自定义的CellRenderer CellRenderer用于在myJList中添加对JCheckBox的支持 当我试图修改DefaultListModel中某个元素的选中状态时,它似乎不会更新我的JList。当我尝试使用以下三种方法中的任何一种来获取某个索引处的元素时,就会发生这种情况:DefaultListModel.elementAt(…),DefaultListModel.get(…)或DefaultListMode

我有一个
JList
,它由
DefaultListModel
支持,并且有一个自定义的
CellRenderer

CellRenderer
用于在my
JList
中添加对
JCheckBox
的支持

当我试图修改
DefaultListModel
中某个元素的选中状态时,它似乎不会更新我的
JList
。当我尝试使用以下三种方法中的任何一种来获取某个索引处的元素时,就会发生这种情况:
DefaultListModel.elementAt(…)
DefaultListModel.get(…)
DefaultListModel.getElementAt(…)

为什么我的
JList
没有得到更新?

我的
JList
部分中注释掉的以下代码部分将起作用。但是,我不喜欢仅仅为了改变布尔值而将一个新对象复制到那个位置


这是我的代码,为便于阅读和理解而简化


JList
部分

public AppsPanel() {
    super(new BorderLayout());

    this.appsListModel = new DefaultListModel<AppListItem>();
    this.appsList = new JList<AppListItem>(this.appsListModel);
    this.appsList.setCellRenderer(new AppsListRenderer());
    this.appsList.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            JList list = (JList) e.getSource();
            int index = list.locationToIndex(e.getPoint());

            AppListItem appListItem = (AppListItem)list.getModel().getElementAt(index);
            appListItem.setSelected(!appListItem.isSelected());

            list.repaint(list.getCellBounds(index, index));
        }
    });
    this.appsScrollPane = new JScrollPane(this.appsList);
    this.add(this.appsScrollPane);
}
...
public void selectAllApps() {
//        for (int i = 0; i < this.appsListModel.size(); i++) {
//            this.appsListModel.set(i, new AppListItem(this.appsListModel.get(i).getApp(), true));
//        }
    for (int i = 0; i < this.appsListModel.size(); i++) {
        this.appsListModel.getElementAt(i).setSelected(true);
    }
}

AppListItem
pojo

public class AppListItem {

    private App app;

    private boolean selected;

    public AppListItem(App app, boolean selected) {
        this.app = app;
        this.selected = selected;
    }

    public App getApp() {
        return app;
    }

    public void setApp(App app) {
        this.app = app;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }
}
public class App {

    private String appName;

    private String appPath;

    public App(String appName, String appPath) {
        this.appName = appName;
        this.appPath = appPath;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getAppPath() {
        return this.appPath;
    }

    public void setAppPath(String appPath) {
        this.appPath = appPath;
    }
}

App
pojo

public class AppListItem {

    private App app;

    private boolean selected;

    public AppListItem(App app, boolean selected) {
        this.app = app;
        this.selected = selected;
    }

    public App getApp() {
        return app;
    }

    public void setApp(App app) {
        this.app = app;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }
}
public class App {

    private String appName;

    private String appPath;

    public App(String appName, String appPath) {
        this.appName = appName;
        this.appPath = appPath;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getAppPath() {
        return this.appPath;
    }

    public void setAppPath(String appPath) {
        this.appPath = appPath;
    }
}

在您希望将更改应用于JList的地方,使用AbstractListModel的以下方法

fireContentsChanged (model, changeStartIndex, changeEndIndex);
已更改的元素由闭合区间changeStartIndex、changeEndIndex指定——包括端点

例如:

在您希望将更改应用于JList的地方,使用AbstractListModel的以下方法

fireContentsChanged (model, changeStartIndex, changeEndIndex);
已更改的元素由闭合区间changeStartIndex、changeEndIndex指定——包括端点

例如:

您的
selectAllApps()
不会触发任何事件。由于无法在默认模型上调用其中一个
fire…
方法,因此在更新后至少应在
JList
上调用
repaint

但我建议实现您自己的模型;没那么难

public class MyListModel extends AbstractListModel<AppListItem> {

    ArrayList<AppListItem> list=new ArrayList<>();

    public void selectAllApps() {
        for(AppListItem i:list) i.setSelected(true);
        fireContentsChanged(this, 0, getSize()-1);
    }

    public int getSize() {
      return list.size();
    }

    public AppListItem getElementAt(int index) {
      return list.get(index);
    }

    // if you need such updates:
    public void add(int index, AppListItem item) {
      list.add(index, item);
      fireIntervalAdded(this, index, index);
    }

    public boolean remove(AppListItem i) {
      int index = list.indexOf(i);
      if(index<0) return false;
      remove(index);
      return true;
    }

    public void remove(int index) {
      list.remove(index);
      fireIntervalRemoved(this, index, index);
    }
}
公共类MyListModel扩展了AbstractListModel{
ArrayList=新建ArrayList();
public void selectAllApps(){
对于(AppListItem i:list)i.setSelected(true);
fireContentsChanged(this,0,getSize()-1);
}
公共int getSize(){
返回list.size();
}
公共应用程序项getElementAt(int索引){
返回列表。获取(索引);
}
//如果您需要此类更新:
公共void添加(int索引,AppListItem项){
列表。添加(索引、项目);
fireIntervalAdded(这个,索引,索引);
}
公共布尔删除(AppListItem i){
int index=list.indexOf(i);
如果(indexYour
selectAllApps()
未触发任何事件。由于无法在默认模型上调用其中一个
fire…
方法,您至少应在更新后调用
JList
上的
repaint

但我建议实现您自己的模型;这并不难

public class MyListModel extends AbstractListModel<AppListItem> {

    ArrayList<AppListItem> list=new ArrayList<>();

    public void selectAllApps() {
        for(AppListItem i:list) i.setSelected(true);
        fireContentsChanged(this, 0, getSize()-1);
    }

    public int getSize() {
      return list.size();
    }

    public AppListItem getElementAt(int index) {
      return list.get(index);
    }

    // if you need such updates:
    public void add(int index, AppListItem item) {
      list.add(index, item);
      fireIntervalAdded(this, index, index);
    }

    public boolean remove(AppListItem i) {
      int index = list.indexOf(i);
      if(index<0) return false;
      remove(index);
      return true;
    }

    public void remove(int index) {
      list.remove(index);
      fireIntervalRemoved(this, index, index);
    }
}
公共类MyListModel扩展了AbstractListModel{
ArrayList=新建ArrayList();
public void selectAllApps(){
对于(AppListItem i:list)i.setSelected(true);
fireContentsChanged(this,0,getSize()-1);
}
公共int getSize(){
返回list.size();
}
公共应用程序项getElementAt(int索引){
返回列表。获取(索引);
}
//如果您需要此类更新:
公共void添加(int索引,AppListItem项){
列表。添加(索引、项目);
fireIntervalAdded(这个,索引,索引);
}
公共布尔删除(AppListItem i){
int index=list.indexOf(i);

如果(解释为什么JCheckBox在不可编辑的jList中呈现JComponents默认情况下,存储在XXXXXX模型中的布尔值表示JCheckBox呈现JComponents很难理解您的注释。=/your
selectAllApps()
不会触发任何事件。由于您无法在默认模型上调用其中一个
激发…
方法,因此在更新后,您至少应该在
JList
上调用
重新绘制
。但我建议实现您自己的模型;这并不难。扩展
AbstractListModel
。您只需要实现两个方法,这在委托给
列表时很容易,例如
ArrayList
LinkedList
。然后添加您自己的方法,当然。请说明为什么JCheckBox在不可编辑的jList中呈现JComponents默认情况下,存储在XxxXxxModel中的布尔值表示JCheckBox呈现JComponents具有非常困难的time理解您的评论。=/your
selectAllApps()
不会触发任何事件。由于您无法在默认模型上调用其中一个
激发…
方法,因此在更新后,您至少应该在
JList
上调用
重新绘制
。但我建议实现您自己的模型;这并不难。扩展
AbstractListModel
。您只需要实现两个方法,这些方法在委派给
列表时很容易,例如
ArrayList
LinkedList
。当然,然后添加您自己的方法。