Problem z przekazywaniem obiektu do innej klasy i JTable

0

Witam!

Mam następujący problem. Mam klase WindowMain z JFrame (okno glowne aplikacji), w ktorym znajduje się tabela JTable. Mam własny tablemodel, jako ze tabela jest wypelniana wartosciami z arraylist. Po kliknieciu guziczka Dodaj w WindowMain wyskakuje kolejne okienko WindowAdd z JDialog, w ktorym to znajdują się trzy textFieldy, które wypełniam i i po kliknieciu Dodaj powinno mi dodać książke do biblioteki. Ksiazka sie dodaje się lecz tabela nie odświeża się. Nowa pozycja pojawia się dopiero po kliknięciu guziczka R w WindowMain ktory wywoluje fireTableDataChange() na tablemodelu mimo ze guziczek Dodaj tez to wywoluje. Zamieszczam kody źródłowe.

WindowMain to główne okno zawiera jeden obiekt typu BookStore ksiegarnia. Z kolei Ksiegarnia zwiera ArrayList<Book> books.

WindowMain.java


                 ...

		JButton butAdd = new JButton("Dodaj");
		butAdd.setBounds(10, 10, 70, 25);
		butAdd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				WindowAdd.main(ksiegarnia);
				
				tmb.fireTableDataChanged();				
				}
		});
		frmKsiegarnia.getContentPane().setLayout(null);
		frmKsiegarnia.getContentPane().add(butAdd);
		
		...
	
}

WindowAdd.java

public class WindowAdd extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private JTextField textFieldTitle;
	private JTextField textFieldAuthor;
	private JTextField textFieldYear;
	
	private static BookStore ksiegarnia;
	
	/**
	 * Launch the application.
	 */
	public static void main(BookStore ksiegarnia) {
		WindowAdd.ksiegarnia=ksiegarnia;
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					WindowAdd frame = new WindowAdd();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public WindowAdd() {

               ...
		
		JButton buttonAdd = new JButton("Dodaj");
		buttonAdd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				ksiegarnia.addBook(textFieldTitle.getText(),textFieldAuthor.getText(),Integer.valueOf(textFieldYear.getText()));
				
				dispose();
			}
		});
		buttonAdd.setBounds(96, 104, 89, 23);
		contentPane.add(buttonAdd);
		
		...
	}
}
0

jedno mnie przeraża, czy zawsze ja ktoś prosi o pomoc to musi od razu wrzucać cały kod?
Jak jesteś w stanie napisać taki program to i pewnie oddzielić tą "na 100% działa" od "może coś jest nie tak".
Zanim dojdę do połowy to zapomnę co, gdzie znaczyło i po prostu mi się znudzi. Zacznę wypisywać mało pomocne głupoty i pójdę grać w Medieval 2.
Pewnie zrobi tak 99% osób i nie doczekasz się pomocy:(

0

Masz racje nie potrzebnie tyle wstawilem. Wywalilem wiekszość :P W zasadzie to chodzi tylko tak naprawde o przekazanie obiektu ksiegarnia z WindowMain do WindowAdd jego modyfikacja (przez dodanie pozycji do ArrayLista books, znajdujacego sie w obiekcie ksiegarnia). Jezeli WindowMain pod guzikiem zamiast obiektu WindowAdd dam wywolanie takiego dodania pozycji na sztywno czyli zamiast:

 butAdd.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                WindowAdd.main(ksiegarnia);
 
                                tmb.fireTableDataChanged();                                
                                }
                });

dam

 butAdd.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                ksiegarnia.add("cos","cos",111);
 
                                tmb.fireTableDataChanged();                                
                                }
                });

to problemu w ogóle nie ma, tabela sie odswieza i jest git. Stad cos musi byc nie tak z tym przekazaniem.


EDIT


Juz wiem w czym problem dokladnie, nie chodzi o samo przekazanie, tylko o to ze musialbym poczekac na zamkniecie okna i dopiero odpalic firetabledatachanged(); i tutaj kolejny problem: nie wiem jak to zrobic :)

0

Nie wiem czy masz to w innym fragmencie kodu:

JTable to zwykły komponent. Tak? Chyba tak. Samo informowanie obiektów nasłuchujących dany model tabeli, po prostu informuje je że coś się zmieniło i tyle. Nie wpływa na ekran. Jak dla mnie brakuje czegoś co by odświeżyło. Wywołanie ksiegarnia.add(...) samo dba o odświeżenie tabeli. A przekazanie obiektu nie. Linijka:

ksiegarnia.repaint();

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