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