Wstawienie listy do JcomboBox

0

Zerknijcie na ponizszy kod czy cos pominalem ?

listaWyboruCwiczenZmienna = new DefaultListModel();          
listaWyboruCwiczenGlowna = new JList(listaWyboruCwiczenZmienna);  //tu jest wszystko ok listy sie tworza i wypełniaja odpowiednimi danymi

JComboBox comboBoxCwiczenie1 = new JComboBox();
comboBoxCwiczenie1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) 
{
for (int i=0;i<listaWyboruCwiczenZmienna.size();i++)
{
comboBoxCwiczenie1.addItem(listaWyboruCwiczenZmienna.get(i)); // problem jest tu nie dodaje mi tego co jest w listaWyboruCwiczenZmienna
}
}
});
0

Jak rozpoznałeś, że się nie dodało? Wyświetliłeś sobie gdzieś nowa zawartość JComboBoksa? W kodzie brakuje repaint().

1

Jesteś pewien, że ładowanie itemów do CB ma być na event tego samego CB a nie w jakiejś metodzie/konstruktorze gdzie tworzysz CB?

0

Tak błędem było to że wrzucałem to w ActionListenera, wystarczył zwykły for. Ale mam kolejny problem nie wiem jak odświeżyć JComboBoxy przy zmianie paneli.
Konkretnie chodzi o to, że mam dwa panele:
PanelPrzebieguCwiczen - mam tam 8xcombobox
PanelEdycjiCwiczen - tam aktualizuje listeWyboruCwiczenZmienna
Próbuje coś takiego ale nie działa. Myslalem, że jak wyrzuce stare dane a przy zmianie panela wrzuce juz nowe bedzie działać ale to nie tak chyba powinno sie robic.

 
try {
	 			
	 		getContentPane().remove(PanelEdycjiCwiczen);
			getContentPane().add(PanelPrzebieguCwiczen);
		    pack();
			validate();
			repaint();	
			
			for (int i=0;i<listaWyboruCwiczenZmienna.size();i++)
		    {   
			      
		    	comboBoxCwiczenie1.remove(i);
		    	comboBoxCwiczenie2.remove(i);
		    	comboBoxCwiczenie3.remove(i);
		    	comboBoxCwiczenie4.remove(i);
		    	comboBoxCwiczenie5.remove(i);
		    	comboBoxCwiczenie6.remove(i);
		    	comboBoxCwiczenie7.remove(i);
		    	comboBoxCwiczenie8.remove(i);

		    }
			 for (int i=0;i<listaWyboruCwiczenZmienna.size();i++)
				    {   
				 
				    	comboBoxCwiczenie1.addItem(listaWyboruCwiczenZmienna.get(i));
				    	comboBoxCwiczenie2.addItem(listaWyboruCwiczenZmienna.get(i));
				    	comboBoxCwiczenie3.addItem(listaWyboruCwiczenZmienna.get(i));
				    	comboBoxCwiczenie4.addItem(listaWyboruCwiczenZmienna.get(i));
				    	comboBoxCwiczenie5.addItem(listaWyboruCwiczenZmienna.get(i));
				    	comboBoxCwiczenie6.addItem(listaWyboruCwiczenZmienna.get(i));
				    	comboBoxCwiczenie7.addItem(listaWyboruCwiczenZmienna.get(i));
				    	comboBoxCwiczenie8.addItem(listaWyboruCwiczenZmienna.get(i));

				    }

			}catch (NullPointerException ex){}
			
0
  1. NPEx się nie łapie :)
  2. Jak chcesz usunąć wszystkie elementy z modelu to zawołaj na CB removeAllItems
  3. Podmieniasz panele, a czy one czasem nie mają swoich oddzielnych CB? Nie bardzo rozumiem
0

OK muszę jeszcze troche o wyjątkach poczytać. Jezeli masz jakies szybkie rady dotyczace różnych wyjatkow np ktorych sie nie łapie :) chętnie poczytam.

0

Pierwszy panel gdzie sa comboboxy :

panelwykcwicznie.JPG

Drugi panel gdzie edytuje liste z ktorej comboboxy ciagnął dane (dodaj, usuwam itp):

paneldodajcw.JPG

Moj problem polega na tym,że przy zmianie paneli DRUGI na PIERWSZY - comboboxy pozostaja w stanie takim jakie były przy uruchomieniu programu. Nie wiem jak zrobic żeby przy zmianie ciagneły dane z nowej listy zmodyfikowanej w panelu edycji. Lista jest zapsiywane w pliku.

0

Ale w czym problem?

  1. Weź aktualną listę
  2. Wyrzuć wszystko z CB
  3. Załaduj nowe itemy do CB
  4. Usuń panel aktualny
  5. Pokaż poprzedni panel

Nawiasem mówiąc przy podmianie paneli często pomocny jest CardLayout

0

No właśnie tak powinno się dziac ale niestety

Przechwytywanie.JPG

Po pierwsze przy naciśnięciu przycisku jezeli nie mam try-catch wywala mi

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at program.GlownaRamka$5.actionPerformed(GlownaRamka.java:355)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 

Po drugie taki kod nie wystarczy żeby usunąć wszystko z combo zostaja dalej stare dane (sprawdzam wartosc listy sie zmienia). Moze to wszytko trzeba jescze jakos odswiezyc.

0

eeeeeeee... comboBoxCwiczenie2 jest nullem. Nie inicjalizujesz tego pola

0

ok wiec jak zainicjowac. Co nalezy wstawic w konstruktorze żeby JComboBox nie był null ?

 
JComboBox comboBoxCwiczenie2 = new JComboBox();
0

To nie to.
Te przyciski w panelu edycji robią takie rzeczy:

JButton PrzyciskDodajCwiczenie = new JButton("");
	 PrzyciskDodajCwiczenie.setIcon(new ImageIcon(GlownaRamka.class.getResource("jpg/dodaj.png")));
	 PrzyciskDodajCwiczenie.addActionListener(new ActionListener() {
	 	public void actionPerformed(ActionEvent e) 
	 	{       
	 		 if (cwiczeniaMapa.containsKey(poleNazwaCwiczenia.getText())==true)
	 		   {
	 		    	System.out.println("TO JUZ JEST W LISCIE");
	 		   }
	 		    
	 		    if (cwiczeniaMapa.containsKey(poleNazwaCwiczenia.getText())==false)
	 		    {
	 		    	cwiczenie = new Cwiczenia(poleNazwaCwiczenia.getText(),textAreaOpisCwiczenia.getText());
		 		    cwiczeniaMapa.put(poleNazwaCwiczenia.getText(), cwiczenie);	
	 		        listaWyboruCwiczenZmienna.addElement(poleNazwaCwiczenia.getText());	
	 		    }

	 		   

	    try {
				FileOutputStream PolaczZapiszCwiczenia = new FileOutputStream("cwiczenia.ser");
				ObjectOutputStream zapiszCwiczenia = new ObjectOutputStream(PolaczZapiszCwiczenia);
				zapiszCwiczenia.writeObject(cwiczeniaMapa);
				zapiszCwiczenia.writeObject(listaWyboruCwiczenZmienna);
				zapiszCwiczenia.close();
			} catch (Exception ex) {
				// TODO Auto-generated catch block
				ex.printStackTrace();
			}
	    poleNazwaCwiczenia.setText("");
	    textAreaOpisCwiczenia.setText("");
		 		}
	 
	 });
JButton PrzyciskUsunCwiczenie = new JButton("");
	 PrzyciskUsunCwiczenie.addActionListener(new ActionListener() {
	 	public void actionPerformed(ActionEvent e) 
	 	{   
	 		listaWyboruCwiczenZmienna.removeElement(poleNazwaCwiczenia.getText());
	 		cwiczeniaMapa.remove(poleNazwaCwiczenia.getText());
            poleNazwaCwiczenia.setText("");
		    textAreaOpisCwiczenia.setText("");
		    try {
				FileOutputStream PolaczZapiszCwiczenia = new FileOutputStream("cwiczenia.ser");
				ObjectOutputStream zapiszCwiczenia = new ObjectOutputStream(PolaczZapiszCwiczenia);
				zapiszCwiczenia.writeObject(cwiczeniaMapa);
				zapiszCwiczenia.writeObject(listaWyboruCwiczenZmienna);
				zapiszCwiczenia.close();
			} catch (Exception ex) {
				// TODO Auto-generated catch block
				ex.printStackTrace();
			}
	 	}
	 });

Za kazdym razem jak cos zmienie i klikne ktorys przycisk lista sie zapisuje a odczyt tej listy jest w main.

public class GlownaRamka extends JFrame implements Serializable
{

    private Uzytkownik uzytkownik;
    private Cwiczenia cwiczenie;
	private JPanel PanelOtwarciaProgramu;
	private JPanel PanelNowegoUzytkownika;
	private JPanel PanelPrzebieguCwiczen;
	private JPanel PanelEdycjiCwiczen;
	private JTextField poleLogin;
	private JTextField poleHaslo;
	private JTextField poleImie;
	private JTextField poleNazwisko;
	private JTextField poleWiek;
	private JScrollPane pasekPionowy;
	private Border obramowanie;
	private JTextField poleWaga;
	private final ButtonGroup buttonGroup = new ButtonGroup();
	private JTextField poleEmail;
	private JTextArea PoleInformacjiOUzytkowniku;
    private static Map<String,Uzytkownik> uzytkownicyMapa;
    private static  Map<String,Cwiczenia> cwiczeniaMapa;
	private OknaDialogowe dialog;
    private JLabel etykietaImieDane;
    private JTextField textFieldCwiczenie1;
    private JTextField textFieldLicznikPowtorzenCwiczenie1;
    private JTextField textFieldCwiczenie2;
    private JTextField textFieldLicznikPowtorzenCwiczenie2;
    private JTextField poleNazwaCwiczenia;
    private JTextField textFieldCwiczenie3;
    private JTextField textFieldLicznikPowtorzenCwiczenie3;
    private JTextField textFieldCwiczenie4;
    private JTextField textFieldLicznikPowtorzenCwiczenie4;
    private JTextField textFieldCwiczenie5;
    private JTextField textFieldLicznikPowtorzenCwiczenie5;
    private JTextField textFieldCwiczenie6;
    private JTextField textFieldLicznikPowtorzenCwiczenie6;
    private JTextField textFieldCwiczenie7;
    private JTextField textFieldLicznikPowtorzenCwiczenie7;
    private JTextField textFieldCwiczenie8;
    private JTextField textFieldLicznikPowtorzenCwiczenie8;
    private JComboBox<Object> comboBoxCwiczenie1;
    private JComboBox<Object> comboBoxCwiczenie2;
    private JComboBox comboBoxCwiczenie3;
    private JComboBox comboBoxCwiczenie4;
    private JComboBox comboBoxCwiczenie5;
    private JComboBox comboBoxCwiczenie6;
    private JComboBox comboBoxCwiczenie7;
    private JComboBox comboBoxCwiczenie8;
    private static DefaultListModel  listaWyboruCwiczenZmienna;
	private JList listaWyboruCwiczenGlowna;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GlownaRamka frame = new GlownaRamka();
					frame.pack();
					frame.setVisible(true);
					
				    }
				 catch (Exception e) 
				{
					e.printStackTrace();
				}
			}
		});

		uzytkownicyMapa = new HashMap<String,Uzytkownik>();
	    cwiczeniaMapa = new HashMap<String,Cwiczenia>();
	    listaWyboruCwiczenZmienna = new DefaultListModel();

		try {
			FileInputStream PolaczOdczytajUzytkownicy = new FileInputStream("uzytkowinicyStan.ser");
			ObjectInputStream odczytajUzytkownicy = new ObjectInputStream(PolaczOdczytajUzytkownicy);
			uzytkownicyMapa =  (Map<String, Uzytkownik>) odczytajUzytkownicy.readObject();
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			FileInputStream PolaczOdczytajCwiczenia = new FileInputStream("cwiczenia.ser");
			ObjectInputStream odczytajCwiczenia = new ObjectInputStream(PolaczOdczytajCwiczenia);
			cwiczeniaMapa =  (Map<String, Cwiczenia>) odczytajCwiczenia.readObject();
			listaWyboruCwiczenZmienna = (DefaultListModel) odczytajCwiczenia.readObject();
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
		
	public Map<String,Uzytkownik> getUzytkownicyMapa()
	{
	return uzytkownicyMapa;	
	}

	public JPanel getPanelOtwarciaProgramu()
	{
	return this.PanelOtwarciaProgramu;
	}
	
	public JPanel getPanelPrzebieguCwiczen()
	{
	return this.PanelPrzebieguCwiczen;
	}
	
	
	/**
	 * Create the frame.
	 */

	public GlownaRamka() {

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		getContentPane().setLayout(new CardLayout(0, 0));
		PanelOtwarciaProgramu = new JPanel();
		
		PanelOtwarciaProgramu.setBorder(new EmptyBorder(5, 5, 5, 5));
	    getContentPane().add(PanelOtwarciaProgramu);
	    
		TU PONIZEJ SA TWORZONE 
                 JComboBox comboBoxCwiczenie2 = new JComboBox();
                 i dodawana do nich lista

Moze w złym miejscu odczytuje ta liste. Moze powinien to jescze raz odczytac przy zmianie paneli.Juz dzisiaj mam dość tych comboboxow jutro przeanalizuje ten kod raz jeszcze. Jakby Wam się coś rzuciło w oczy to piszcie.

0

Kto mi wytłumaczy dlaczego zmiana w JComboBox działa w tym kodzie - przycisk znajduje sie w tym samym panelu co JCombo:

 
JButton btnAktcombo = new JButton("aktcombo");
	    btnAktcombo.addActionListener(new ActionListener() {
	    	public void actionPerformed(ActionEvent e) {
	    		
	    		comboBoxCwiczenie1.removeAllItems();
	 			comboBoxCwiczenie1.addItem("POLE1");
		 		comboBoxCwiczenie1.addItem("POLE2");
	    	}
	    });

a nie działa w poniższym. Fakt różnica jest taka, że ten przycisk jest w innym panelu i zmienia jeszcze panel na ten z JComboBox oprócz zmiany treści w Combo.

 
przyciskWsteczEdycjaDoCwiczenia.addActionListener(new ActionListener() {
	 	public void actionPerformed(ActionEvent arg0) 
	 	{

	 		getContentPane().remove(PanelEdycjiCwiczen);
	 		
	 		getContentPane().add(PanelPrzebieguCwiczen);
			
			pack();
			
			validate();
			
			repaint();	
			
			comboBoxCwiczenie1.removeAllItems();
 			comboBoxCwiczenie1.addItem("POLE1");
		 	comboBoxCwiczenie1.addItem("POLE2");
	 	}
	 });
	 



0

Dlaczego CB jest we framie a nie w panelu PanelPrzebieguCwiczen?
Moim zdaniem powinieneś przed dodaniem panelu PanelPrzebieguCwiczen przygotować go tzn. wywołać na nim metodę, która podmieni model w CB a na końcu zawołać pack, validate,repaint...

0

Combo jest w panelu.

Przechwytywanie.JPG

Ale może racja, że powinienem się do tej zmiany elementu w Combo odwolac przez panel tylko w jaki sposób ?
Jak panel jest załadowany i umiesciłbym przycisk zmiany w Combo obok przycisku Edycja cwiczen - dane w Combo zmieniaja sie bezproblemow.

0

do PanelPrzebieguCwiczen dodaj metode

public void changeComboModel(List<String>model){
comboBoxCwiczenie1.removeAllItems();
//tu dodaj itemy
}
PanelPrzebieguCwiczen.changeComboModel(model);
getContentPane().add(PanelPrzebieguCwiczen);
pack();
validate();
repaint();  
0

To wydaje sie byc bardzo dobre rozwiazanie. Mam tylko jedno pytanie.Jezeli moj kod wyglada tak:

 
/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GlownaRamka frame = new GlownaRamka();
					frame.pack();
					frame.setVisible(true);
					
				    }
				 catch (Exception e) 
				{
					e.printStackTrace();
				}
			}
		});

/**
	 * Create the frame.
	 */
	
	
	public GlownaRamka() {
		
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		getContentPane().setLayout(new CardLayout(0, 0));
		
                 PanelOtwarciaProgramu = new JPanel();
		 PanelOtwarciaProgramu.setBorder(new EmptyBorder(5, 5, 5, 5));
	         getContentPane().add(PanelOtwarciaProgramu);
	    
		
		 PanelNowegoUzytkownika = new JPanel();
		 PanelNowegoUzytkownika.setBorder(new EmptyBorder(5, 5, 5, 5));
	         getContentPane().add(PanelNowegoUzytkownika);
		
	        PanelPrzebieguCwiczen = new JPanel();
	        PanelPrzebieguCwiczen.setBorder(new EmptyBorder(5, 5, 5, 5));
                getContentPane().add(PanelPrzebieguCwiczen);
	    
	        PanelEdycjiCwiczen = new JPanel();
	        PanelEdycjiCwiczen.setBorder(new EmptyBorder(5, 5, 5, 5));
	        getContentPane().add(PanelEdycjiCwiczen);
	 

to jest przykład chodzi o to, że panele mam w konstruktorze ramki w jaki sposób przypisuje się metodę do konkretnego panelu. Gdyby to były oddzielne klasy nie było by problemu ale w takiej sytuacji ?

0

Tak myślałem, że wszystko masz w jednej klasie, co nie jest najlepszym rozwiązaniem.
W takim wypadku trzeba zrobić wszystko w tej samej klasie, co już próbowałeś zrobić ale leciał NPEx.
Pokaż pełny kod.

0

OK w takim razie coś wymyśle skoro działa przycisk dodatkowy który zmienia elementy może wstawie jakiegos listnera do Panelu, ktory przy ruchu myszy aktualizuje liste, albo po prostu przycisk aktualizuj, jest kilka opcji najważniejsze zeby Panel był juz dodany do ramki i widoczny. A tak na przyszłość - kazdy panel powinien byc jednak oddzielna klasa ?

0

Czy do metody

comboBox.removeAll(); 

coś jescze się dodaje ?

 
package test;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;

import test.Uzytkownik;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;

public class GlownaRamka extends JFrame {

	private JPanel contentPane;
    private ArrayList<Uzytkownik> uzytkownicyLista = new ArrayList<Uzytkownik>();;
	
    
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GlownaRamka frame = new GlownaRamka();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	

	
	public GlownaRamka() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		
		
		
		JComboBox comboBox = new JComboBox();
		comboBox.addItem("POLE1");
		comboBox.addItem("POLE2");
		JButton btnNewButton = new JButton("New button");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				comboBox.removeAll();
				comboBox.addItem("POLE3");
			
			}
		});
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane.setHorizontalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(Alignment.TRAILING, gl_contentPane.createSequentialGroup()
					.addContainerGap(97, Short.MAX_VALUE)
					.addComponent(comboBox, GroupLayout.PREFERRED_SIZE, 238, GroupLayout.PREFERRED_SIZE)
					.addGap(89))
				.addGroup(gl_contentPane.createSequentialGroup()
					.addContainerGap()
					.addComponent(btnNewButton)
					.addContainerGap(325, Short.MAX_VALUE))
		);
		gl_contentPane.setVerticalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addContainerGap()
					.addComponent(btnNewButton)
					.addGap(56)
					.addComponent(comboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(141, Short.MAX_VALUE))
		);
		contentPane.setLayout(gl_contentPane);
	}
}

Po kliknieciu przycisku - powinno wszystko zniknac i pojawic sie tylko POLE3 niestety wyglada to tak,że POLE3 sie dodaje ale POLE2 i POLE1 nie znika z combo

Bez tytułu.jpg

1
comboBox.removeAllItems();

zamiast

comboBox.removeAll();
0

Dzięki @garai za pomoc w tym wątku. Działa tak jak powinno.

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