【问题标题】:Removing an item from the JList using ListModel as model type使用 ListModel 作为模型类型从 JList 中删除项目
【发布时间】:2011-04-25 03:57:46
【问题描述】:

我有 JList 使用 ListModel 而不是 DefaultListModel。我现在不想更改类型,因为我在很多地方都在使用它。我想从同一个列表中删除选定的项目。我该怎么做呢?我正在使用以下代码,但它不适合我。

made_list.removeSelectionInterval(
    made_list.getSelectedIndex(), made_list.getSelectedIndex());

--编辑--

我在创建列表时使用以下代码:

made_list = new javax.swing.JList();   
made_list.setModel(new DefaultListModel());

然后在JButton mouseclick 事件中,我使用以下代码在按下按钮时从列表中删除所选项目

private void removeActionPerformed(java.awt.event.ActionEvent evt) {                                       
    //made_list.removeSelectionInterval(made_list.getSelectedIndex(), 
    //made_list.getSelectedIndex());  
    System.out.println(made_list.getModel());  
    DefaultListModel model = (DefaultListModel)made_list.getModel();  
    model.remove(1);  
}

【问题讨论】:

  • 很抱歉,我正在使用 NetBeans 将列表组件绘制到面板上。当我使用 getModel() 时,我得到 javax.swing.JList$4@34f09710 并且当我尝试将其类型转换为 DefaultListModel 时,我在线程“AWT-EventQueue-0”java.lang.ClassCastException:javax.swing 中得到错误异常.JList$4 不能转换为 javax.swing.DefaultListModel
  • 重新格式化的代码;复制编辑;如果不正确请还原。如果您使用DefaultListModel,那么ClassCastException 是有意义的。您应该能够将其转换为您的自定义模型。
  • 请查看对我上一个答案所做的修改,包括我的 SSCCE 版本。

标签: java swing jlist


【解决方案1】:

removeSelectionInterval 不会从模型或列表中删除任何内容,除了选择间隔。列表项保持完好无损。恐怕你要么必须扩展你的 ListModel 并给它一个 removeItem(...) 方法以及侦听器和触发通知器的能力等等......就像 AbstractListModel - 很多工作的!不过,如果是我的钱,我会走简单的路线,只需将 DefaultListModel 用于我的模型,因为这样做更安全,更容易,并且花费的时间更少。我知道你说你不想使用这些,但我认为你会发现它比你的潜在替代品容易得多。

SSCCE 的示例如下所示:

import java.awt.event.*;
import javax.swing.*;

public class Foo1 {
   private String[] elements = {"Monday", "Tueday", "Wednesday"};
   private javax.swing.JList made_list = new javax.swing.JList();

   public Foo1() {
      made_list.setModel(new DefaultListModel());
      for (String element : elements) {
         ((DefaultListModel) made_list.getModel()).addElement(element);
      }

      JButton removeItemBtn = new JButton("Remove Item");
      removeItemBtn.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            removeActionPerformed(e);
         }
      });

      JPanel panel = new JPanel();
      panel.add(new JScrollPane(made_list));
      panel.add(removeItemBtn);

      JOptionPane.showMessageDialog(null, panel);
   }

   private void removeActionPerformed(ActionEvent e) {
      System.out.println("made_list's model: " + made_list.getModel());
      System.out.println("Model from a fresh JList: " + new JList().getModel());
      DefaultListModel model = (DefaultListModel) made_list.getModel();
      if (model.size() > 0) {
         model.remove(0);
      }
   }

   public static void main(String[] args) {
      new Foo1();
   }

}

【讨论】:

  • 我已将列表创建为 DefaultListModel,当我使用此 DefaultListModel 模型 = (DefaultListModel)made_list.getModel();访问 DefaultListModel 的方法我遇到了错误
  • 线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException: javax.swing.JList$4 无法转换为 javax.swing.DefaultListModel
  • @Deepak:让我们在此线程中查看更多有问题的代码,作为对您原始帖子的编辑。我建议向我们展示您使用 DefaultListModel 对象设置列表模型的位置,以及您尝试访问此模型并调用它的方法的位置。在我看来,您好像是在尝试将 JList,而不是其模型转换为 DefaultListModel,但是当我们看到您的代码时,我们会确定您在做什么。
  • @Deepak:您确定这两个 JList 是相同的,您没有在类中声明一个,而在构造函数中声明另一个(具有 DefaultListModel 的模型)或方法?我认为如果没有可编译的可运行代码,很难弄清楚这一点,但你的整个程序可能太大太笨重,对我们来说没有多大用处。考虑创建并发布一个可显示您的问题但没有多余代码的小型可运行程序,SSCCE
  • +1 良好的工作代码。要删除选定的一个,需要简单的代码更改,将代码:if (model.size() > 0) model.remove(0); 更改为此代码:if(made_list.getSelectedIndex() != -1) model.remove(made_list.getSelectedIndex()); 只是想知道,如果列表视图的顺序与模型不同,在这种情况下你会遇到问题吗?
【解决方案2】:

过去,您已获得指向 Swing 教程不同部分的链接,以帮助解决问题。这样做是有原因的。它有助于解决您当前的问题。它为您将来的问题提供参考。

您需要做的就是查看 Swing 教程的目录,您将找到“如何使用列表”部分,其中有一个可以从列表中添加/删除项目的工作示例。请先阅读教程。

或者,如果您不记得如何找到 Swing 教程,请阅读 JList API,您会在其中找到指向同一教程的链接。

【讨论】:

    【解决方案3】:
    //First added  item into the list
    DefaultListModel dlm1=new DefaultListModel();
    
    listLeft.setModel(dlm1);
    
    dlm1.addElement("A");
    dlm1.addElement("B");
    dlm1.addElement("C");
    
    // Removeing element from list
    Object[] temp=listRight.getSelectedValues();
    if(temp.length>0)
    {
    for(int i=0;i<temp.length;i++)
    {
    
      dlm1.removeElement(temp[i]);
    
    }
    }                   
    

    【讨论】:

    • 尝试在您的代码中添加一些描述 - 这将有助于更好地理解为什么会这样
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多