java图形用户界面之列表框

KelGravatt 8年前
   <p>列表框通过Swing组件JList产生,其总是在屏幕上占据固定行数的空间。如果要得到列表框中被选中的元素, 只需调用getSelectedValuesList(),它可以产生一个字符串数组 ,内容为被选中的元素名称。 JList组件允许多重选择 ;如果按住Ctrl键,可以选中所有点击的元素;如果选中一个元素,按住Shift键并单击另一个元素,那么这两个元素之间的所有元素都被选中;要从选中的元素中去掉一个,按住Ctrl键单击该元素即可。</p>    <p>初始化列表框后,接着便是向列表框添加和修改内容。分为静态操作和动态操作。</p>    <h3><strong>1、静态操作</strong></h3>    <p>静态操作便是将所有元素同时添加到JList中, 添加后不能修改,不能删除 ,即在程序执行过程中不能操作列表框。</p>    <p>E.g.</p>    <pre>  <code class="language-java">package test;    import javax.swing.*;  import java.awt.*;  import static net.mindview.util.SwingConsole.*;    public class ListTest1 extends JFrame{      private String[] str = {"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"};      private JList list;public ListTest1()      {          list = new JList(str);          setLayout(new FlowLayout());          add(list);      }            public static void main(String[] args)      {          run(new ListTest1(),200,100);      }  }      </code></pre>    <p>如上例,只要在初始化JList时将所有元素添加进去即可。</p>    <p>执行结果:列表框不可以被操作。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7e0f7f78fef795c0999567036a161f77.jpg"></p>    <h3><strong>2、动态操作</strong></h3>    <p>通过查看JList的方法,可以发现JList不负责列表框的动态操作,所有的动态操作的细节可以在“列表模型”即DefaultListModel中完成,只需将该列表模型加入JList即可。</p>    <p>DefaultListModel listmodel = new DefaultListModel();</p>    <p>listmodel.addElement(element1);//添加元素</p>    <p>listmodel.clear();//清除全部元素</p>    <p>listmodel.remove(int index);//清除指定位置的元素</p>    <p>E.g.</p>    <pre>  <code class="language-java">package test;    import java.awt.*;import java.awt.event.*;import static net.mindview.util.SwingConsole.*;  import javax.swing.*;  import javax.swing.border.Border;  import javax.swing.event.ListSelectionEvent;  import javax.swing.event.ListSelectionListener;    public class ListTest extends JFrame{      private String[] str = {"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"};      private JButton button1 = new JButton("Add Item"),                      button2 = new JButton("Clear Item");      private JTextArea text = new JTextArea(str.length,20);      private DefaultListModel listmodel = new DefaultListModel();      private JList list = new JList(listmodel);      //将列表模型加入JList,列表模型负责完成动态操作,JList负责创建列表以及许多其它工作(如多重选择)。      private int count = 0;      private boolean flag = false;            public ListTest()      {          text.setEditable(false);//只是用来显示,不能编辑          for(int i = 0;i<4;i++)          {              listmodel.addElement(str[count++]);          }                    button1.addActionListener(new ActionListener(){              public void actionPerformed(ActionEvent e)              {                 if(count<str.length)                 {                     listmodel.addElement(str[count++]);                 }else                 {                     button1.setEnabled(flag);                     flag = true;                 }              }          });                    button2.addActionListener(new ActionListener(){              public void actionPerformed(ActionEvent e)              {                  if(count<str.length)                  {                      count = 0;//列表重新开始添加元素                      listmodel.clear();//列表元素清除                      text.setText(null);                  }else                  {                      count = 0;                      listmodel.clear();                      text.setText(null);                      button1.setEnabled(flag);//启动按钮                  }              }          });                    list.addListSelectionListener(new ListSelectionListener(){              @SuppressWarnings("deprecation")              public void valueChanged(ListSelectionEvent e)              {                 if(e.getValueIsAdjusting())                      return;                  //如果检测到事件在更改,则返回true,后面语句不执行;当更改结束后,则返回false,执行后面语句。                for(Object item : list.getSelectedValuesList())                  {                      text.append(item + "\n");//List型对象转换为Object                  }                  //list调用getSelectedValuesList()方法,产生一个字符串数组,内容为被选中的元素名称              }          });                    setLayout(new FlowLayout());          Border border = BorderFactory.createMatteBorder(1, 1, 2, 2, Color.RED);//添加边框          list.setBorder(border);//设置边框          text.setBorder(border);          add(button1);          add(button2);          add(new JScrollPane(text));          add(list);      }            public static void main(String[] args)       {          run(new ListTest(),250,375);      }  }    </code></pre>    <p>执行结果:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/71f25ed48a005a0c29bf4f398e6409f0.jpg"></p>    <p>在上面的程序中,对JList的处理过程中用到了JList所支持的事件ListSelectionEvent的getValueIsAdjusting()方法以及JList的getSelectedValuesList()方法,需要注意这两个方法的用法。</p>    <p>(1)Boolean....getValueIsAdjusting()</p>    <p>返回此事件是否是仍然在更改的多个不同事件之一,如果此事件是仍然在更改的多个不同事件之一,则返回 true。</p>    <p>例如,对于选择被更新以响应一个用户的拖动的事件,那么在拖动开始时,此属性被设置为 true;在拖动结束时被设置为 false。在拖动期间,监听器接收 valueIsAdjusting 属性设置为 true 的事件。在拖动的最后,当更改终止时,监听器接收一个值设置为 false 的事件。</p>    <p>如果将JList对象的注册程序去掉更新检测的语句:</p>    <pre>  <code class="language-java">if(e.getValueIsAdjusting())      return;  </code></pre>    <p>输出为:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/09e78e9667078a3852620806843cb88c.jpg"></p>    <p>可见,没有了更新检测,选中列表框元素后,有重复输出。</p>    <p>(2)...getSelectedValuesList()</p>    <p>JList对象调用getSelectedValuesList()方法,产生一个 字符串数组 ,内容为被选中的元素名称。</p>    <h3><strong>3、JList滚动条</strong></h3>    <p>JList本没有对滚动提供直接的支持,我们只要将JList包装进JScrollPane,它将自动帮助处理所有细节。</p>    <p>总结:JList想添加元素,可以执行将所有元素在JList初始化时加入的静态操作,也可以利用“列表模型”DefaultListModel处理所有列表修改细节的动态操作。</p>    <p>注意:在JList元素选择的过程中可能会用到更新检测,从而确保程序的稳定性。</p>    <p> </p>    <p>来自:http://www.cnblogs.com/shiyiaccn/p/5978789.html</p>    <p> </p>