gpt4 book ai didi

java - 修改 DefaultListModel 中的元素不更新模型

转载 作者:行者123 更新时间:2023-12-01 18:41:47 26 4
gpt4 key购买 nike

我有一个JListDefaultListModel 支持并有一个自定义CellRenderer .

CellRenderer用于添加对 JCheckBox 的支持在我的JList .

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

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

我的 JList 下面的代码部分被注释掉的部分将起作用。但是,我不喜欢仅仅为了更改 boolean 值而将新对象复制到该位置。

<小时/>

这是我的代码,经过简化以便于阅读和理解。

<小时/>

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);
}
}
<小时/>

CellRenderer部分。

public class AppsListRenderer extends JCheckBox implements ListCellRenderer<AppListItem> {

@Override
public Component getListCellRendererComponent(JList<? extends AppListItem> list, AppListItem value, int index, boolean isSelected, boolean cellHasFocus) {
this.setSelected(value.isSelected());
if (value.getApp() != null) {
this.setText(value.getApp().getAppName());
}
return this;
}
}
<小时/>

AppListItem波乔

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;
}
}
<小时/>

App波乔

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;
}
}

最佳答案

您的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);
}
}

关于java - 修改 DefaultListModel 中的元素不更新模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713246/

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