Odwołanie do pola static innej klasy

2015-02-13 09:34
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);
        }
        {
edytowany 1x, ostatnio: furious programming, 2015-02-13 16:39

Pozostało 580 znaków

2015-02-13 09:42
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2015-02-13 09:44

Pozostało 580 znaków

2015-02-13 09:48
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 ?

Nie dewastuj wątku - nie usuwaj postów z odpowiedzią. - bogdans 2015-02-13 11:52

Pozostało 580 znaków

2015-02-13 09:58
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()

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans, 2015-02-13 10:20

Pozostało 580 znaków

2015-02-13 12:13
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); 
     }

Pozostało 580 znaków

2015-02-13 12:21
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2015-02-13 12:25
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

Pozostało 580 znaków

2015-02-13 12:36
0

Wracam dzisiaj do lektury o referencjach ....

Pozostało 580 znaków

2015-02-13 12:39
0

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

OknaDialogowe dialog = new OknaDialogowe(this);

na

OknaDialogowe dialog = new OknaDialogowe(GlownaRamka.this);

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2015-02-15 09:51
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 poprostu 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);
    }

}

Pozostało 580 znaków

2015-02-15 10:34

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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2015-02-15 10:46

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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