2012-11-05 60 views
1

我將一個字符串添加到JListDefaultListModel,它需要幾秒鐘才能出現。有時,我可能需要點擊JList才能顯示列表。JList非常緩慢地添加第一個元素

我正在使用Eclipse Indigo。在將元素添加到JList之後設置斷點時,執行速度很快。

我搜索了網絡和SO的JList慢,他們都談論增加許多項目的名單。我將第一個元素添加到列表中。

這裏是我的代碼片段:

private DefaultListModel function_list_model = new DefaultListModel(); 
    private JList list_functions = new JList(function_list_model); 
//... 
// Initialization code: 
     JPanel panel_function_list = new JPanel(); 
     panel_function_list.setBounds(10, 53, 541, 220); 
     panel_functions.add(panel_function_list); 
     panel_function_list.setLayout(null); 

     JLabel lblFunctions = new JLabel("Functions"); 
     lblFunctions.setHorizontalAlignment(SwingConstants.CENTER); 
     lblFunctions.setBounds(235, 11, 99, 14); 
     panel_function_list.add(lblFunctions); 
     list_functions.setBorder(new LineBorder(new Color(0, 0, 0))); 

     list_functions.setBounds(10, 42, 492, 177); 
     list_functions.setFont(new Font("Courier New", Font.PLAIN, 12)); 
     list_functions.setPreferredSize(new Dimension(0, 150)); 
     list_functions.setMinimumSize(new Dimension(32767, 100)); 
     list_functions.setMaximumSize(new Dimension(32767, 100)); 
     JScrollPane scrollPane_functions = new JScrollPane(list_functions); 
     scrollPane_functions.setBounds(10, 79, 541, 183); 
     panel_functions.add(scrollPane_functions); 

// Code to add a string: 
    String burger = new String("burger"); 
    function_list_model.addElement(burger); 

我還使用的WindowBuilder與Eclipse。如何提高JList的性能?

+2

請'那麼,如何提高JList中的表現?'什麼......,一切都在休息你的代碼,沒有性能問題的實際數量的項目(500-2000),但超過100的任何東西都是關於源端的分頁 – mKorbel

+1

list_functions.setMinimumSize(new Dimension(32767,100));是(32767/1080> = 30全高清監視器)是否確定WindowBuider適用於各種方式(對於ms_access或wpf也是如此) – mKorbel

回答

2

,如果你想我可以生成新的ItemChar[],並呼籲doClick()JButton("Fire")

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

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; 
    private javax.swing.Timer timer = null; 
    private int delay = 3; 
    private int count = 0; 

    public ListDemo() { 
     super(new BorderLayout()); 
     listModel = new DefaultListModel(); 
     listModel.addElement("Jane Doe"); 
     listModel.addElement("John Smith"); 
     listModel.addElement("Kathy Green"); 
     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(); 
     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); 
     start(); 
     System.out.println(new Date()); 
    } 

    private void start() { 
     timer = new javax.swing.Timer(delay * 10, updateCol()); 
     timer.start(); 
    } 

    public Action updateCol() { 
     return new AbstractAction("text load action") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       listModel.addElement("Jane Doe"); 
       listModel.addElement("John Smith"); 
       listModel.addElement("Kathy Green"); 
       list.ensureIndexIsVisible(listModel.getSize()-1); 
       count++; 
       if (count >= 500) { 
        timer.stop(); 
        System.out.println("update cycle completed"); 
        System.out.println(new Date()); 
       } 
      } 
     }; 
    } 

    class FireListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      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()) { 
        index--; 
       } 
       list.setSelectedIndex(index); 
       list.ensureIndexIsVisible(index); 
      } 
     } 
    } 

    class HireListener implements ActionListener, DocumentListener { 

     private boolean alreadyEnabled = false; 
     private JButton button; 

     HireListener(JButton button) { 
      this.button = button; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String name = employeeName.getText(); 
      if (name.isEmpty() || 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); 
      //listModel.addElement(employeeName.getText()); 
      employeeName.requestFocusInWindow(); 
      employeeName.setText(""); 
      list.setSelectedIndex(index); 
      list.ensureIndexIsVisible(index); 
     } 

     protected boolean alreadyInList(String name) { 
      return listModel.contains(name); 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      enableButton(); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      handleEmptyTextField(e); 
     } 

     @Override 
     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; 
     } 
    } 

    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     if (e.getValueIsAdjusting() == false) { 

      if (list.getSelectedIndex() == -1) { 
       fireButton.setEnabled(false); 
      } else { 
       fireButton.setEnabled(true); 
      } 
     } 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("ListDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JComponent newContentPane = new ListDemo(); 
     newContentPane.setOpaque(true); 
     frame.setContentPane(newContentPane); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
}