sortowanie JList

0

Czy mógłby mi ktoś pomóc fragmentem kodu, podać linka itp, jak zrobić najprostsze sortowanie JList. Większość rzeczy jakie znalazłem na ten temat to strona kodu np tu:
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/sorted_jlist/
A czy nie ma jakiejś prostszego sposobu posortowania alfabetycznie wprowadzanych wyrazów do JList??

Dziękuję z góry za pomoc

0

Nie możesz danych zapisać wcześniej do tablicy i wykonać sortowanie a później do modelu ?

int[] intArray = new int[] {4, 1, 3, -23}; Arrays.sort(intArray); 
// [-23, 1, 3, 4] 
String[] strArray = new String[] {"z", "a", "C"}; Arrays.sort(strArray);
 // [C, a, z]
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
 // [a, C, z] 
Arrays.sort(strArray, Collections.reverseOrder());
 // [z, a, C] 
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER); Collections.reverse(Arrays.asList(strArray)); 
// [z, C, a] 
0

Tak właśnie kombinowałem, ale w momencie jak dodawałem dane z tablicy, nie odświeżała mi się lista. Innymi słowy nazwisko po naciśnięciu enteru pojawiało się w tablicy (bo ją wyprowadziłem na konsolę aby widzieć co się dzieje), ale nie pojawiało się na JList.

Bez sortowania to wyglądało tak. Z sortowaniem tablicy bym sobie poradził ale niech najpierw ta tablica pojawi się na liście.

public class JLista extends JFrame implements ActionListener{
	//String[] items = { "one", "two", "three", "four", "five" };

	ArrayList<String> tablica = new ArrayList<String>();
	JList list=new JList();	
	JTextField jText = new JTextField();
	
public JLista(){
    
	JPanel PanelGorny = new JPanel();
	PanelGorny.setLayout(new GridLayout(1,1));	
	PanelGorny.add(jText);
	jText.addKeyListener(new KeyListener() {
	
		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
		       int key = e.getKeyCode();
   	            
       	    if ((key == KeyEvent.VK_ENTER))
    			        {
    			String a=jText.getText();    		   		   
    			tablica.add(a);
    			jText.setText("");	
    			System.out.println(tablica);
    			        }
		
		}

		@Override
		public void keyReleased(KeyEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void keyTyped(KeyEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		   
		   
		
	});
	
	
	
	JPanel Glowny =new JPanel();
	Glowny.setLayout(new BorderLayout());
	Glowny.add(PanelGorny, BorderLayout.NORTH);
	Glowny.add(list);
	add(Glowny);
   } 




public static void
run(final JFrame f, final int width, final int height) {
	SwingUtilities.invokeLater(new Runnable(){
		public void run(){
			f.setTitle("Lista");
			f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			f.setSize(width,height);
			f.setVisible(true);
						}
	});
}
public static void main(String[] args){

	run(new JLista(), 250, 250);
}



@Override
public void actionPerformed(ActionEvent arg0) {
	// TODO Auto-generated method stub
	
}
}
0

Spróbuj w liście używać swojego modelu danych, np:

public class SortedListModel extends AbstractListModel {

	List<String> list;

	public SortedListModel() {
		list = new ArrayList<String>();
	}
	
	@Override
	public Object getElementAt(int index) {
		return list.size() != 0 ? list.get(index) : null; 
	}

	@Override
	public int getSize() {
		return list.size();
	}
	
	public void addElement(String string) {
		list.add(string);
		Collections.sort(list);
		fireIntervalAdded(this, 0, getSize());
	}
}

Teraz w KeyListenerze wystarczy że wywołasz na modelu metodę addElement()

0

Ja zrobiłem cos takiego działa.

public class JLista extends JFrame {
    
    ArrayList<String> tablica = new ArrayList<String>();
    JList list = new JList();
    JTextField jText = new JTextField();

    public JLista() {

        JPanel PanelGorny = new JPanel();
        PanelGorny.setLayout(new GridLayout(2, 1));
        JScrollPane listScroller = new JScrollPane(list);
        list.setVisibleRowCount(3);

        listScroller.setPreferredSize(new Dimension(250, 80));

        PanelGorny.add(listScroller);
        PanelGorny.add(jText);
        jText.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent e) {
                // TODO Auto-generated method stub
                int key = e.getKeyCode();
                if ((key == KeyEvent.VK_ENTER)) {
                    String a = jText.getText();
                    tablica.add(a);
                    Collections.sort(tablica);                    
                    DefaultListModel istModel = new DefaultListModel();
                    for(String s:tablica)
                    {
                        istModel.addElement(s);
                    }

                    list.setModel(istModel);
                    System.out.println(tablica.size()+"  "+list.getModel().getSize());
                    jText.setText("");
                    System.out.println(tablica);
                }

            }

            @Override
            public void keyReleased(KeyEvent arg0) {
                // TODO Auto-generated method stub
            }

            @Override
            public void keyTyped(KeyEvent arg0) {
                // TODO Auto-generated method stub
            }
        });
        add(PanelGorny);
    }

    public static void run(final JFrame f, final int width, final int height) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                f.setTitle("Lista");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setSize(width, height);
                f.setVisible(true);
            }
        });
    }

    public static void main(String[] args) {
        run(new JLista(), 250, 250);
    }
}
0

działa i to świetnie!!!

No właśnie i to jest proste rozwiązanie! Ale widać proste rozwiązania są najtrudniejsze :-P

Zdecydowanie prostsze niż z tutoriala!!!

Dziękuję bardzo!

0

rozwiązanie skrzyha może i działa, ale zupełnie niepotrzebnie po każdym dodaniu nowego elementu jest tworzony nowy model danych i od nowa są do niego dodawane elementy

0

Ja to rozwiązałem w ten sposób . Wasz wątek mnie na to naprowadził .
Dodaje to, może komuś takie rozwiązanie się przyda.

 

    private void sortujAlfabetycznie()
    {
      int tmpi =this.modelIsty.toArray().length ;
      String[] tmp = new String[tmpi];
      for(int s =0 ; s<tmpi; s++)
      {
          tmp[s]= this.modelIsty.getElementAt(s).toString();
      }
       Arrays.sort(tmp,String.CASE_INSENSITIVE_ORDER);
       this.modelIsty.removeAllElements();
       for(int i =0; i<tmp.length ; i++)
       {
           this.modelIsty.addElement(tmp[i]);
       }
    }

private DefaultListModel modelIsty = new DefaultListModel(){

// nadpisane metody 
 
        @Override
        public void addElement(Object obj) 
        {
            lista.add(obj);
            super.addElement(obj);
        }

        @Override
        public Object get(int index) 
        {
          return lista.get(index); 
        }
  
        @Override
           public Object remove(int index) 
           {
              lista.remove(index);  
              return super.remove(index); 
           }
       public Object[] toArray()
       {
          return lista.toArray();
       }
        
        ArrayList lista = new ArrayList();

};
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1