Odwołanie do pola static innej klasy

0

Mam dwie klasy
GlownaRamka - gdzie znajduje sie public static ArrayList<Uzytkownik> uzytkownicyLista do ktorej chce sie odwolac w drugiej klasie OknaDialogowe. Ponizej poczatki kodu z obu klas
Jest jescze trzecia klasa ale tam sa tylko konstruktory i metody set,get.

GlownaRamka

public class GlownaRamka extends JFrame implements Serializable
{
    private Uzytkownik uzytkownik;
	private JPanel PanelOtwarciaProgramu;
	private JPanel PanelNowegoUzytkownika;
	private JPanel PanelPrzebieguCwiczen;
	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;
	public static ArrayList<Uzytkownik> uzytkownicyLista = new ArrayList<Uzytkownik>();
    
	/**
	 * Launch the application.
	 */
	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();
				}
			}

OknaDialogowe

package program;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import static GlownaRamka.uzytkownicyLista;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JPasswordField;
import javax.swing.LayoutStyle.ComponentPlacement;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class OknaDialogowe extends JDialog {

	private final JPanel contentPanel = new JPanel();
	private JTextField textField;
	private JPasswordField passwordField;
	private JButton okButton;
	private JButton cancelButton;
	

	public OknaDialogowe() 
	{
		setBounds(100, 100, 250, 200);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		
		{
			textField = new JTextField();
			textField.setColumns(10);
		}
		
		passwordField = new JPasswordField();
		{
			okButton = new JButton("OK");
			okButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) 
				{
				
				************TU SIE CHCE ODWOLAC DO ArrayList<Uzytkownik> uzytkownicyLista************************	
				
				}
			});
			okButton.setActionCommand("OK");
			getRootPane().setDefaultButton(okButton);
		}
		{
0
GlownaRamka.uzytkownicyLista;

Masz jakieś ważne powody żeby ta lista była static? Jeśli użytkownik (np. Ty sam) uruchomi dwie instancje programu, to w obu będzie miał tę samą listę użytkowników.

0

Nie chciałbym żeby tak było wiec w jaki sposób odwołać się do listy która jest stworzona w innej klasie i ma dodatkowo private ?

0

Na private lekarstwem są gettery i settery.
Gdzieś w klasie GlownaRamka tworzysz okno dialogowe, coś w rodzaju

new OknoDialogowe();

zamień na

new OknoDialogowe(this);

rozbuduj trochę kod klasy OknoDialogowe

public class OknaDialogowe extends JDialog {
 
    private final JPanel contentPanel = new JPanel();
    private JTextField textField;
    private JPasswordField passwordField;
    private JButton okButton;
    private JButton cancelButton;
    private GlownaRamka mainWindow;
 
    public OknaDialogowe(GlownaRamka window) 
    {
        this.mainWindow = window;
        setBounds(100, 100, 250, 200);

odwołuj się przez

mainWindow.listaUzytkownikow
//lub
mainWindow.getListaUzytkownikow()
0

Rozumiem, że na poczatku dodaje zmienna klasy do innej klasy

  private GlownaRamka mainWindow; 

ale jak rozumiec to ze wywoluje konstruktor okna dialogowego ze zmienna GlownejRamki - co to robi ?

 
public OknaDialogowe(GlownaRamka window)  
    {
        this.mainWindow = window;
         setBounds(100, 100, 250, 200); 
     }
0

W wierszu

private GlownaRamka mainWindow;

tylko deklarujesz zmienną (pole) typu GlownaRamka, w wierszu

this.mainWindow = window;

"odbierasz" i zapamiętujesz referencję do głównego okna.
Sądząc po tym poście, powinieneś wrócić do lektury.

0

Wywołanie konstruktora OknaDialogowego mam po kliknieciu buttona

 
private OknaDialogowe dialog;
*
*
*KOD
*
*
public void actionPerformed(ActionEvent e) 
			{
			
				OknaDialogowe dialog = new OknaDialogowe(this);
				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
				dialog.setVisible(true);
			
			}

ale niestety wyrzuca mi błąd
Bez tytułu.jpg

0

Wracam dzisiaj do lektury o referencjach ....

0

Skoro tworzysz dialog w klasie wewnętrznej to musisz zmienić

OknaDialogowe dialog = new OknaDialogowe(this);

na

OknaDialogowe dialog = new OknaDialogowe(GlownaRamka.this);
0

Dobrze a czy mógłbym prosić o dosłownie wpisanie kodu jakiego nalezy uzyc na podstawie tego:

Mam utworzone 3 klasy:
Uzytkowik - przechowuje zmienne imie,nazwisko wiek i metody set i get
GlownaRamka - jest to po prostu ramka gdzie jest ArrayList<uzytkownik>, gdzie po kliknieciu przycisku dodanieUzytkownika jest tworzony new Uzytkownik
OknaDialogowe - jest to klasa z JDialog, ktorej wywołanie nastepuje po kliknieciu przycisku dodanieUzytkownika (równocześnie z tworzeniem i dodaniem new uzytkownik do Array)

Moje pytanie jak w poprawny sposób odwołać się do ArrayList<uzytkownik> w klasie OknaDialogowe (zaznaczyłem komentarzem miejsce gdzie chciałbym uzyskac dostep do ArrayList)

Klasa Uzytkownik

 
package test;
 
public class Uzytkownik 
{
    private String imie;
    private String nazwisko;
    private int wiek;
 
    public Uzytkownik (String imie,String nazwisko,int wiek) 
    {
 
    this.imie = imie;
    this.nazwisko = nazwisko;
    this.wiek = wiek;
    }
    //--------------------------------------------------------------------//
    public void setImie(String a)
    {
    this.imie = a;    
    }
 
    public String getImie()
    {
    return imie;    
    }
    //--------------------------------------------------------------------//
    public void setNazwisko(String a)
    {
    this.nazwisko = a;    
    }
 
    public String getNazwisko()
    {
    return nazwisko;    
    }
    //--------------------------------------------------------------------//
    public void setWiek(int a)
    {
    this.wiek = a;    
    }
 
    public int getWiek()
    {
    return wiek;    
    }
    //--------------------------------------------------------------------//
}
 

Klasa GlownaRamka

 
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);
 
        JButton dodanieUzytkownika = new JButton("dodanieUzytkownikaIotwarcieOknaDialogowego");
        dodanieUzytkownika.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) 
            {
 
                OknaDialogowe okno1 = new OknaDialogowe();
                okno1.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                okno1.setVisible(true);
                 Uzytkownik a = new Uzytkownik("Marcin","Gortat",28);
                 uzytkownicyLista.add(a);
 
 
            }
        });
        GroupLayout gl_contentPane = new GroupLayout(contentPane);
        gl_contentPane.setHorizontalGroup(
            gl_contentPane.createParallelGroup(Alignment.TRAILING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addContainerGap(129, Short.MAX_VALUE)
                    .addComponent(dodanieUzytkownika, GroupLayout.PREFERRED_SIZE, 176, GroupLayout.PREFERRED_SIZE)
                    .addGap(119))
        );
        gl_contentPane.setVerticalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addGap(72)
                    .addComponent(dodanieUzytkownika, GroupLayout.PREFERRED_SIZE, 73, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(106, Short.MAX_VALUE))
        );
        contentPane.setLayout(gl_contentPane);
    }
 
}
 

Klasa OknaDialogowe

 
public class OknaDialogowe extends JDialog {
 
    private final JPanel contentPanel = new JPanel();
    private JPanel buttonPane;
    private JTextArea textArea;
 
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
 
 
    }
 
    /**
     * Create the dialog.
     */
    public OknaDialogowe() {
        setBounds(100, 100, 450, 300);
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        {
            textArea = new JTextArea();
        }
        {
            buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            {
                JButton okButton = new JButton("OK");
                okButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e)
                    {
                    //**********************************************************************************************
                        //-------Tu chce sie odwolac do listy uzytkownicyLista, ktora przechowuje uzytkownikow
                        //-------Tak zeby w textArea pojawilo sie imie i nazwisko uzytkownika
                    //**********************************************************************************************    
                    }
                });
                okButton.setActionCommand("OK");
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
            {
                JButton cancelButton = new JButton("Cancel");
                cancelButton.setActionCommand("Cancel");
                buttonPane.add(cancelButton);
            }
        }
        GroupLayout groupLayout = new GroupLayout(getContentPane());
        groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addComponent(contentPanel, GroupLayout.PREFERRED_SIZE, 434, GroupLayout.PREFERRED_SIZE)
                .addComponent(buttonPane, GroupLayout.PREFERRED_SIZE, 434, GroupLayout.PREFERRED_SIZE)
        );
        groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addComponent(contentPanel, GroupLayout.PREFERRED_SIZE, 228, GroupLayout.PREFERRED_SIZE)
                    .addComponent(buttonPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
        );
        GroupLayout gl_contentPanel = new GroupLayout(contentPanel);
        gl_contentPanel.setHorizontalGroup(
            gl_contentPanel.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPanel.createSequentialGroup()
                    .addGap(32)
                    .addComponent(textArea, GroupLayout.PREFERRED_SIZE, 182, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(210, Short.MAX_VALUE))
        );
        gl_contentPanel.setVerticalGroup(
            gl_contentPanel.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPanel.createSequentialGroup()
                    .addGap(5)
                    .addComponent(textArea, GroupLayout.PREFERRED_SIZE, 182, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(31, Short.MAX_VALUE))
        );
        contentPanel.setLayout(gl_contentPanel);
        getContentPane().setLayout(groupLayout);
    }
 
}
 
1

Klasa GlownaRamka

//dopisanie gettera, bo pole jest private
    private ArrayList<Uzytkownik> uzytkownicyLista = new ArrayList<Uzytkownik>();;
    public ArrayList<Uzytkownik> getUzytkownicyLista() {
		return uzytkownicyLista;
	}
//wywołany nowy konstruktor klasy OknoDialogowe
        dodanieUzytkownika.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) 
            {

                OknoDialogowe okno1 = new OknoDialogowe(GlownaRamka.this);
                ... 

Klasa OknoDialogowe

//nowe pole i inny konstruktor
    private GlownaRamka mainWindow;

    public OknoDialogowe(GlownaRamka window) {
        this.mainWindow = window;
        ...
//obsługa klawisza (zakładam, że chcesz dopisać imię i nazwisko pierwszego użytkownika
                    public void actionPerformed(ActionEvent e)
                    {
                    	Uzytkownik u = mainWindow.getUzytkownicyLista().get(0);
                    	textArea.setText(u.getImie()+" "+u.getNazwisko());
                    }

Btw, tyle śmieciowego kodu wygenerowanego przez graficzny designer a okna wyglądają paskudnie.

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