ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-GUI actionPerformed valueChanged问题

2019-12-08 01:01:32  阅读:224  来源: 互联网

标签:jlist swing java user-interface


为什么我从RemoveAction类收到运行时错误
当我的ChannelListener类包括在内时?如果我注释掉
我的ChannelListener类的RemoveAction类与我一样
会期望的.我如何让两个班级一起工作?

Exception in thread “AWT-EventQueue-0”
java.lang.ArrayIndexOutOfBoundsException: -1 at
java.util.ArrayList.get(ArrayList.java:323) at
GuiDriver$ChannelListListener.valueChanged(GuiDriver.java:121) at
javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:187)
at
javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167)
at
javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:214)
at
javax.swing.DefaultListSelectionModel.removeIndexInterval(DefaultListSelectionModel.java:611)
at
javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(BasicListUI.java:2204)
at
javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:161)
at
javax.swing.DefaultListModel.removeElement(DefaultListModel.java:364)
at GuiDriver$RemoveAction.actionPerformed(GuiDriver.java:98)

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import java.io.*;


public class GuiDriver extends JFrame{
   JList channelTitleJList, itemTitleJList;
   DefaultListModel cModel, iModel;
   List<RssReader> feedList = new ArrayList<RssReader>();   
   int nextFeed=0;
   ListSelectionModel lsm;


   public void addFeed(RssReader feed){
      feedList.add(feed);
   }


   public JToolBar createToolBar(){
      JToolBar bar = new JToolBar();
      Action newToolBarButton = new AddAction("New");
      Action deleteToolBarButton = new RemoveAction("Delete");
      Action clearToolBarButton = new ClearAction("Clear");

      bar.add(newToolBarButton);  
      bar.add(deleteToolBarButton);
      bar.add(clearToolBarButton);

      bar.setFloatable(false);      
      return bar;
   }


   public JSplitPane createJSplitPane(){
      JSplitPane hSplitPane  = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,createChannelJScrollPane(), createItemJScrollPane());
      hSplitPane.setDividerLocation(150);
      return hSplitPane;
   }


   public JScrollPane createChannelJScrollPane(){            
      cModel = new DefaultListModel(); 
      channelTitleJList = new JList(cModel);
      JScrollPane channelJScrollPane = new JScrollPane(channelTitleJList);
      channelTitleJList.setVisibleRowCount(20);
      lsm = channelTitleJList.getSelectionModel();
      lsm.addListSelectionListener(new ChannelListListener());      

      return channelJScrollPane;     
   }


   public JScrollPane createItemJScrollPane(){
      iModel = new DefaultListModel();
      itemTitleJList = new JList(iModel);
      JScrollPane itemJScrollPane = new JScrollPane(itemTitleJList);
      //itemTitleJList.addListSelectionListener(new ItemListListener());

      return itemJScrollPane;
   }   


   public class AddAction extends AbstractAction{
      public AddAction(String name){
         super(name);
      }

      public void actionPerformed(ActionEvent e){
         System.out.println(getValue(Action.NAME)+" selected.");
         JOptionPane message = new JOptionPane();
         String firstInput = message.showInputDialog(null, "Enter URL");
         try{
            DumpStockPage.readXml(firstInput);
            File f = new File("RSSFeed.xml");
            addFeed(new RssReader(f));

            cModel.addElement(feedList.get(nextFeed).rssChannel.getTitle());
            nextFeed++;
            iModel.clear();
         }
         catch (IOException ee){
            System.err.println(ee);
         }
      }
   }


   public class RemoveAction extends AbstractAction{
      public RemoveAction(String name){
         super(name);
      }

      public void actionPerformed(ActionEvent e){
         cModel.removeElement(channelTitleJList.getSelectedValue());
         iModel.clear();
      } 
   }

   public class ClearAction extends AbstractAction{
      public ClearAction(String name){
         super(name);
      }

      public void actionPerformed(ActionEvent e){
         iModel.clear();
      } 
   }


   private class ChannelListListener implements ListSelectionListener{
      public void valueChanged (ListSelectionEvent e) {        
        /* boolean adjust = e.getValueIsAdjusting();
         if (!adjust) {
            List<String> titles = new ArrayList<String>();
            int i = channelTitleJList.getSelectedIndex(); //the index of the selected item in the left list

            for(RssItem feed: feedList.get(i).rssChannel.items) {
                titles.add(feed.getTitle());  //build a list of titles, to be shown in the right list
            }

            itemTitleJList.setListData(titles.toArray()); //change the content of the right list
         }*/ 
      }
   }

/*   
   private class ItemListListener implements ListSelectionListener {
     public void valueChanged (ListSelectionEvent e) {
        boolean adjust = e.getValueIsAdjusting();
        if (!adjust) {
           int i = e.getLastIndex();
           try{ 
              JFrame w = new JFrame();
              w.setTitle("Html Display"); 
              w.setSize(1000, 600); 
              w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              w.setVisible(true); 

              JEditorPane htmlPane = new JEditorPane();
              htmlPane.setPage(feedList.get(i).rssChannel.items.get(i).getLink());
              w.add(new JScrollPane(htmlPane));
           }
           catch(Exception ee){ 
              ee.printStackTrace();
           }
        }
     }
   }
*/  

   public static void main(String[] args) { 
      EventQueue.invokeLater(new Runnable() { 
         public void run() {  
            GuiDriver frame = new GuiDriver(); 

            frame.setTitle("RSS Reader");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
            frame.add(frame.createJSplitPane(), BorderLayout.NORTH);
            frame.add(frame.createToolBar(), BorderLayout.SOUTH);

            frame.setVisible(true);
            frame.setSize(800,400);
         }   
      });  
   }
}

解决方法:

当您使用JList.getSelectedIndex()时,如果没有选择,则必须期望值为-1.
在这种情况下,您将从feedList.get(i)获得ArrayIndexOutOfBoundsException.

标签:jlist,swing,java,user-interface
来源: https://codeday.me/bug/20191208/2087896.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有