Java Tutorial/Swing/JList Model

Материал из Java эксперт
Перейти к: навигация, поиск

Adding and Removing an Item in a JList Component

import javax.swing.DefaultListModel;
import javax.swing.JList;
public class Main {
  public static void main(String[] argv) throws Exception {
    DefaultListModel model = new DefaultListModel();
    JList list = new JList(model);
    // Initialize the list with items
    String[] items = { "A", "B", "C", "D" };
    for (int i = 0; i < items.length; i++) {
      model.add(i, items[i]);
    }
  }
}





Append an item

import javax.swing.DefaultListModel;
import javax.swing.JList;
public class Main {
  public static void main(String[] argv) throws Exception {
    // Create a list that allows adds and removes
    DefaultListModel model = new DefaultListModel();
    JList list = new JList(model);
    int pos = list.getModel().getSize();
    model.add(pos, "E");
  }
}





Create a list that allows adds and removes

import javax.swing.DefaultListModel;
import javax.swing.JList;
public class Main {
  public static void main(String[] argv) throws Exception {
    DefaultListModel model = new DefaultListModel();
    JList list = new JList(model);
    int pos = 0;
    model.add(pos, "a");
  }
}





DefaultListModel and JList

/*
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/* ListDemo.java requires no other files. */
public class ListDemo extends JPanel implements ListSelectionListener {
  private JList list;
  private DefaultListModel listModel;
  private static final String hireString = "Hire";
  private static final String fireString = "Fire";
  private JButton fireButton;
  private JTextField employeeName;
  public ListDemo() {
    super(new BorderLayout());
    listModel = new DefaultListModel();
    listModel.addElement("Debbie Scott");
    listModel.addElement("Scott Hommel");
    listModel.addElement("Sharon Zakhour");
    // Create the list and put it in a scroll pane.
    list = new JList(listModel);
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    list.setSelectedIndex(0);
    list.addListSelectionListener(this);
    list.setVisibleRowCount(5);
    JScrollPane listScrollPane = new JScrollPane(list);
    JButton hireButton = new JButton(hireString);
    HireListener hireListener = new HireListener(hireButton);
    hireButton.setActionCommand(hireString);
    hireButton.addActionListener(hireListener);
    hireButton.setEnabled(false);
    fireButton = new JButton(fireString);
    fireButton.setActionCommand(fireString);
    fireButton.addActionListener(new FireListener());
    employeeName = new JTextField(10);
    employeeName.addActionListener(hireListener);
    employeeName.getDocument().addDocumentListener(hireListener);
    String name = listModel.getElementAt(list.getSelectedIndex()).toString();
    // Create a panel that uses BoxLayout.
    JPanel buttonPane = new JPanel();
    buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
    buttonPane.add(fireButton);
    buttonPane.add(Box.createHorizontalStrut(5));
    buttonPane.add(new JSeparator(SwingConstants.VERTICAL));
    buttonPane.add(Box.createHorizontalStrut(5));
    buttonPane.add(employeeName);
    buttonPane.add(hireButton);
    buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    add(listScrollPane, BorderLayout.CENTER);
    add(buttonPane, BorderLayout.PAGE_END);
  }
  class FireListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      // This method can be called only if
      // there"s a valid selection
      // so go ahead and remove whatever"s selected.
      int index = list.getSelectedIndex();
      listModel.remove(index);
      int size = listModel.getSize();
      if (size == 0) { // Nobody"s left, disable firing.
        fireButton.setEnabled(false);
      } else { // Select an index.
        if (index == listModel.getSize()) {
          // removed item in last position
          index--;
        }
        list.setSelectedIndex(index);
        list.ensureIndexIsVisible(index);
      }
    }
  }
  // This listener is shared by the text field and the hire button.
  class HireListener implements ActionListener, DocumentListener {
    private boolean alreadyEnabled = false;
    private JButton button;
    public HireListener(JButton button) {
      this.button = button;
    }
    // Required by ActionListener.
    public void actionPerformed(ActionEvent e) {
      String name = employeeName.getText();
      // User didn"t type in a unique name...
      if (name.equals("") || alreadyInList(name)) {
        Toolkit.getDefaultToolkit().beep();
        employeeName.requestFocusInWindow();
        employeeName.selectAll();
        return;
      }
      int index = list.getSelectedIndex(); // get selected index
      if (index == -1) { // no selection, so insert at beginning
        index = 0;
      } else { // add after the selected item
        index++;
      }
      listModel.insertElementAt(employeeName.getText(), index);
      // If we just wanted to add to the end, we"d do this:
      // listModel.addElement(employeeName.getText());
      // Reset the text field.
      employeeName.requestFocusInWindow();
      employeeName.setText("");
      // Select the new item and make it visible.
      list.setSelectedIndex(index);
      list.ensureIndexIsVisible(index);
    }
    // This method tests for string equality. You could certainly
    // get more sophisticated about the algorithm. For example,
    // you might want to ignore white space and capitalization.
    protected boolean alreadyInList(String name) {
      return listModel.contains(name);
    }
    // Required by DocumentListener.
    public void insertUpdate(DocumentEvent e) {
      enableButton();
    }
    // Required by DocumentListener.
    public void removeUpdate(DocumentEvent e) {
      handleEmptyTextField(e);
    }
    // Required by DocumentListener.
    public void changedUpdate(DocumentEvent e) {
      if (!handleEmptyTextField(e)) {
        enableButton();
      }
    }
    private void enableButton() {
      if (!alreadyEnabled) {
        button.setEnabled(true);
      }
    }
    private boolean handleEmptyTextField(DocumentEvent e) {
      if (e.getDocument().getLength() <= 0) {
        button.setEnabled(false);
        alreadyEnabled = false;
        return true;
      }
      return false;
    }
  }
  // This method is required by ListSelectionListener.
  public void valueChanged(ListSelectionEvent e) {
    if (e.getValueIsAdjusting() == false) {
      if (list.getSelectedIndex() == -1) {
        // No selection, disable fire button.
        fireButton.setEnabled(false);
      } else {
        // Selection, enable the fire button.
        fireButton.setEnabled(true);
      }
    }
  }
  /**
   * Create the GUI and show it. For thread safety, this method should be
   * invoked from the event-dispatching thread.
   */
  private static void createAndShowGUI() {
    // Create and set up the window.
    JFrame frame = new JFrame("ListDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Create and set up the content pane.
    JComponent newContentPane = new ListDemo();
    newContentPane.setOpaque(true); // content panes must be opaque
    frame.setContentPane(newContentPane);
    // Display the window.
    frame.pack();
    frame.setVisible(true);
  }
  public static void main(String[] args) {
    // Schedule a job for the event-dispatching thread:
    // creating and showing this application"s GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }
}





extends AbstractListModel

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
public class JBenchFrame extends JFrame {
  BorderLayout borderLayout1 = new BorderLayout();
  JList list1 = new JList();
  JButton fillButton = new JButton();
  public static void main(String[] args) {
    JBenchFrame bm = new JBenchFrame();
  }
  public JBenchFrame() {
    this.getContentPane().setLayout(borderLayout1);
    this.setSize(new Dimension(400, 300));
    fillButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        ListData ld = new ListData();
        long tmStart = System.currentTimeMillis();
        list1.setModel(ld);
        list1.repaint();
        long tmEnd = System.currentTimeMillis();
        System.out.println(tmEnd - tmStart);
      }
    });
    fillButton.setText("Fill");
    this.getContentPane().add(new JScrollPane(list1), BorderLayout.CENTER);
    this.getContentPane().add(fillButton, BorderLayout.SOUTH);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
  }
}
class ListData extends AbstractListModel {
  String[] strings = new String[10000];
  public ListData() {
    for (int i = 0; i < 10000; i++) {
      strings[i] = "bob" + i;
    }
  }
  public int getSize() {
    return strings.length;
  }
  public Object getElementAt(int index) {
    return strings[index];
  }
}





extends DefaultListModel

import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
class MyListModel extends DefaultListModel {
  protected int[] count = new int[100];
  public Object getElementAt(int index) {
    if (index < 100) {
      count[index]++;
    }
    return super.elementAt(index);
  }
  public void dump() {
    for (int i = 0; i < 100; i++) {
      if (count[i] != 0) {
        System.out.println(i + "\t" + count[i] + "\t\t" + elementAt(i));
      }
    }
  }
}
public class Main extends JFrame {
  MyListModel model = new MyListModel();
  public Main() {
    for (int i = 0; i < 25; i++) {
      model.addElement("A" + i);
    }
    JList list = new JList(model);
    getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        model.dump();
        System.exit(0);
      }
    });
    pack();
    setVisible(true);
  }
  public static void main(String arg[]) {
    new Main();
  }
}





Getting the Items in a JList Component

import javax.swing.JList;
public class Main {
  public static void main(String[] argv) throws Exception {
    String[] items = { "A", "B", "C", "D" };
    JList list = new JList(items);
    // Get number of items in the list
    int size = list.getModel().getSize(); // 4
    // Get all item objects
    for (int i = 0; i < size; i++) {
      Object item = list.getModel().getElementAt(i);
    }
  }
}





Insert an item at the beginning

import javax.swing.DefaultListModel;
import javax.swing.JList;
public class Main {
  public static void main(String[] argv) throws Exception {
    DefaultListModel model = new DefaultListModel();
    JList list = new JList(model);
    int pos = 0;
    model.add(pos, "a");
  }
}





JList: ListModel and ListSelectionModel. The ListModel handles data. ListSelectionModel works with the GUI.

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
public class List {
  public static void main(String[] args) {
    final DefaultListModel model = new DefaultListModel();
    final JList list = new JList(model);
    JFrame f = new JFrame();
    f.setTitle("JList models");
    
    model.addElement("A");
    model.addElement("B");
    model.addElement("C");
    model.addElement("D");
    model.addElement("E");
    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
    JPanel leftPanel = new JPanel();
    JPanel rightPanel = new JPanel();
    leftPanel.setLayout(new BorderLayout());
    rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    list.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
    list.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
          int index = list.locationToIndex(e.getPoint());
          Object item = model.getElementAt(index);
          String text = JOptionPane.showInputDialog("Rename item", item);
          String newitem = "";
          if (text != null)
            newitem = text.trim();
          else
            return;
          if (!newitem.isEmpty()) {
            model.remove(index);
            model.add(index, newitem);
            ListSelectionModel selmodel = list.getSelectionModel();
            selmodel.setLeadSelectionIndex(index);
          }
        }
      }
    });
    leftPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    leftPanel.add(new JScrollPane(list));
    JButton removeall = new JButton("Remove All");
    JButton add = new JButton("Add");
    JButton rename = new JButton("Rename");
    JButton delete = new JButton("Delete");
    add.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String text = JOptionPane.showInputDialog("Add a new item");
        String item = null;
        if (text != null)
          item = text.trim();
        else
          return;
        if (!item.isEmpty())
          model.addElement(item);
      }
    });
    delete.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        ListSelectionModel selmodel = list.getSelectionModel();
        int index = selmodel.getMinSelectionIndex();
        if (index >= 0)
          model.remove(index);
      }
    });
    rename.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        ListSelectionModel selmodel = list.getSelectionModel();
        int index = selmodel.getMinSelectionIndex();
        if (index == -1)
          return;
        Object item = model.getElementAt(index);
        String text = JOptionPane.showInputDialog("Rename item", item);
        String newitem = null;
        if (text != null) {
          newitem = text.trim();
        } else
          return;
        if (!newitem.isEmpty()) {
          model.remove(index);
          model.add(index, newitem);
        }
      }
    });
    removeall.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        model.clear();
      }
    });
    rightPanel.add(add);
    rightPanel.add(rename);
    rightPanel.add(delete);
    rightPanel.add(removeall);
    rightPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20));
    panel.add(leftPanel);
    panel.add(rightPanel);
    f.add(panel);
    f.setSize(350, 250);
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}





Methods are used to remove items

import javax.swing.DefaultListModel;
import javax.swing.JList;
public class Main {
  public static void main(String[] argv) throws Exception {
    DefaultListModel model = new DefaultListModel();
    JList list = new JList(model);
    // Remove the first item
    int pos = 0;
    model.remove(pos);
    // Remove the last item
    pos = model.getSize() - 1;
    if (pos >= 0) {
      model.remove(pos);
    }
    // Remove all items
    model.clear();
  }
}





Set method replaces an item

import javax.swing.DefaultListModel;
import javax.swing.JList;
public class Main {
  public static void main(String[] argv) throws Exception {
    DefaultListModel model = new DefaultListModel();
    JList list = new JList(model);
    // Replace the 2nd item
    int pos = 1;
    model.set(pos, "b");
  }
}





SortedListModel: sortable JList

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.*;
import java.util.*;
class SortedListModel extends AbstractListModel {
  SortedSet<Object> model;
  public SortedListModel() {
    model = new TreeSet<Object>();
  }
  public int getSize() {
    return model.size();
  }
  public Object getElementAt(int index) {
    return model.toArray()[index];
  }
  public void add(Object element) {
    if (model.add(element)) {
      fireContentsChanged(this, 0, getSize());
  }
}
  public void addAll(Object elements[]) {
    Collection<Object> c = Arrays.asList(elements);
    model.addAll(c);
    fireContentsChanged(this, 0, getSize());
  }
  public void clear() {
    model.clear();
    fireContentsChanged(this, 0, getSize());
  }
  public boolean contains(Object element) {
    return model.contains(element);
  }
  public Object firstElement() {
    return model.first();
  }
  public Iterator iterator() {
    return model.iterator();
  }
  public Object lastElement() {
    return model.last();
  }
  public boolean removeElement(Object element) {
    boolean removed = model.remove(element);
    if (removed) {
      fireContentsChanged(this, 0, getSize());
    }
    return removed;
  }
}

public class JListLocationToIndexSample {
  public static void main(String args[]) {
    SortedListModel model = new SortedListModel();
    
    model.add("A");
    model.add("C");
    model.add("Z");
    model.add("B");
    
    JFrame frame = new JFrame("Selecting JList");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    JList jlist = new JList(model);
    JScrollPane scrollPane1 = new JScrollPane(jlist);
    frame.add(scrollPane1, BorderLayout.CENTER);
    frame.setSize(350, 200);
    frame.setVisible(true);
  }
}