Odwołanie do array listy z innej klasy

0

Mam problem,jak odwołać się do arraylisty utworzonej w innej klasie?

Oto kody do klas.

Klasa z arraylist:

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Czasopismo extends JFrame implements ActionListener
{
   private JTextField nazwaW;
   private JTextField nazwaCz;
   private JTextField tematyka;
   private JTextField czestotliwosc;
   private JTextArea  opis;
   private JDialogokno;
   private JPanel panel,panel2;
   private JLabel etykieta;
   private JLabel etykieta1;
   private JLabel etykieta2;
   private JLabel etykieta3;
   private JButtonprzyciskOk;
   private JButtonprzyciskAnuluj;
   private JPanel panelPrzyciskow;
   private String czasopisma;
   private DefaultListModel model = new DefaultListModel();
   private final  JList lista = new JList(model);
   private List<String> Czasopisma = new ArrayList<String>();

   public Czasopismo()
   {
      setSize(400,300);
      setTitle("Dodaj czasopismo.");

      panel = new JPanel();
      panel2 = new JPanel();
      panel.setLayout(new GridLayout(5,2));

      etykieta= new JLabel("Nazwa Czasopisma: ");
      nazwaCz=new JTextField("");

      etykieta1= new JLabel("Nazwa Wydawnictwa: ");
      nazwaW=new JTextField("");

      etykieta2=new JLabel("Tematyka: ");
      tematyka=new JTextField("");

      etykieta3=new JLabel("Czestotliwosc wydawania: ");
      czestotliwosc=new JTextField("");

      opis = new JTextArea("");
      opis.setFont(new Font("Arial", Font.BOLD, 16));
      opis.setLineWrap(true);
      opis.setWrapStyleWord(true);
      JScrollPane areaScrollPane = new JScrollPane(opis);
      areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
      areaScrollPane.setPreferredSize(new Dimension(200, 200));

      panel.add(etykieta);
      panel.add(nazwaCz);
      panel.add(etykieta1);
      panel.add(nazwaW);
      panel.add(etykieta2);
      panel.add(tematyka);
      panel.add(etykieta3);
      panel.add(czestotliwosc);
      panel2.add(opis);

      add(panel,BorderLayout.CENTER);
      add(panel2,BorderLayout.SOUTH);
 
      przyciskOk = new JButton("Dodaj");
      przyciskOk.addActionListener(this);
 
      przyciskAnuluj = new JButton("Zamknij");
      przyciskAnuluj.addActionListener(this);
 
      panelPrzyciskow = new JPanel();
      panelPrzyciskow.add(przyciskOk);
      panelPrzyciskow.add(przyciskAnuluj);
      add(panelPrzyciskow, BorderLayout.SOUTH);
   }

   public void actionPerformed(ActionEvent ev)
   {
      Object z =ev.getSource();

      if(z==przyciskAnuluj)
         setVisible(false);
      else if(z==przyciskOk)
      {
         try
         {
            PrintWriter zapis = new PrintWriter(new BufferedWriter(new FileWriter("log.txt",true)));
            int odp= JOptionPane.showConfirmDialog(null,"Czy na pewno dodac czasopismo?","komunikat",JOptionPane.YES_NO_OPTION);

            if(odp==JOptionPane.YES_OPTION) 
            {
               czasopisma=nazwaCz.getText();
               zapis.println(etykieta.getText()+czasopisma);

               Czasopisma.add(czasopisma);
               model.addElement(Czasopisma);
               System.out.println(Czasopisma);

               zapis.println(etykieta1.getText()+nazwaW.getText());
               zapis.println(etykieta2.getText()+tematyka.getText());
               zapis.println(etykieta3.getText()+czestotliwosc.getText());
               zapis.println();
               zapis.close();
            }
            else if(odp==JOptionPane.NO_OPTION)
               JOptionPane.showMessageDialog(null,"Anulowano przez uzytkownika");
         }
         catch ( Exception ew )
         {
            ew.printStackTrace();
         }
      }
   }
}

I kod klasy, w której się chcę odwołać do arraylisty:

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class wyswietL extends JFrame implements ActionListener
{
   private JRadioButton wCzasopisma,wWydawnictwa;
   private ButtonGroup grupa;
   private JPanel panelPrzyciskow;
   private DefaultListModel model = new DefaultListModel();
   private final  JList lista = new JList(model);
   private JScrollPane panelist;

   public wyswietL()
   {
      setSize(400,300);
      setTitle("Wyswietl");

      grupa=new ButtonGroup();
      wCzasopisma=new JRadioButton("Wyswietl Czasopisma",true);
      wCzasopisma.addActionListener(this);

      wWydawnictwa=new JRadioButton("Wyswietl Wydawnictwa");
      wWydawnictwa.addActionListener(this);

      grupa.add(wCzasopisma);
      grupa.add(wWydawnictwa);

      panelPrzyciskow = new JPanel();
      panelPrzyciskow.add(wCzasopisma);
      panelPrzyciskow.add(wWydawnictwa);
      add(panelPrzyciskow, BorderLayout.NORTH);

      lista.setVisibleRowCount(9);
      lista.setPrototypeCellValue("Liczba nr.1 - 000");
      panelist = new JScrollPane();
      panelist.setViewportView(lista);
      add(lista, BorderLayout.CENTER);
   }

   public void actionPerformed(ActionEvent e)
   {
      Object z=e.getSource();

      if(wCzasopisma.isSelected())
      {
      }
   }
}
0

Możesz zmienić private na public .
Możesz dopisać publiczną metodę get(), w klasie Czasopismo która będzie zwracała obiekt typu ArrayList.
Możesz uczynić klasę Wyswietl jako wewnętrzną klasę Czasopismo.

0

Cały ten kod nadaje się tylko do kosza.
Lekcja na dziś: czym różni się klasa od obiektu
Lekcja na jutro: zasada jednej odpowiedzialności

0

Shalom, podobnie jak autor jestem jeszcze Newbie ale powiedz w jaki sposób prawidłowo pisze się aplikacje, żeby klasy komunikowały się ze sobą? Np. Jeśli zajdzie z jakichś powodów sytuacja jak powyższa, jedna klasa ma tablicę, do której dostęp potrzebuje druga. Jak rozumieć zasadę jednej odpowiedzialności na przykładzie podobnego projektu?

2

Klasa to jest opis grupy obiektów które z punktu widzenia struktury i zachowania są do siebie podobne, są "tego samego typu". Klasy się między sobą nie komunikują bo klasy nie są "aktywne". OBIEKTY klas mogą się komunikować i mogą potrzebować odwoływać się do siebie (patrz: delegacja). Zasada jednej odpowiedzialności mówi że obiekt powinien zajmować się tylko jedną rzeczą.
Obiekt z serii "człowiek orkiestra" czyli taki który jednocześnie jest jakimś obiektem modelu logicznego i okienkiem i jeszcze action listenerem i cholera wie czym jeszcze, to nie jest dobry obiekt.
Programowanie polega na myśleniu, a nie na klepaniu.

Wracając do przykładu: jeśli obiekty potrzebują siebie nawzajem to należy do jednego z tych obiektów wstrzyknąć odpowiednią zależność (ang. dependency injection) na przykład przez seter albo konstruktor (bo patrząc na kod powyżej, zanim autor dojdzie do kontenerów IoC to miną wieki).

Za proponowanie zmiany widzialności pola na public powinna być chłosta i zakaz używania komputera ;] Jeszcze raz podkreślam: programowanie polega na myśleniu. Wszystko co mamy w kodzie powinno mieć jakąś przyczynę i jakiś cel. Jeśli nagle musimy zmienić pole z private na public albo na pole statyczne to znaczy że coś bardzo złego dzieje się w tym kodzie...

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