addActionListener w innej klasie

0

Witam!
Mam taki kawałek kodu:

Główna klasa Frame:

package package_;

import javax.swing.*;
import java.awt.*;

/**
 * Created by nmrowka on 23.07.17.
 */

public class Frame extends JPanel {

    private JButton buttonAdd = new JButton("Dodaj");
    private JButton buttonRmv = new JButton("Usuń");

    private JTextField txtName = new JTextField(10);
    private JTextField txtSurname = new JTextField(10);
    private JTextField txtAge = new JTextField(3);

    private JLabel labelName = new JLabel("Imię");
    private JLabel labelSurname = new JLabel("Nazwisko");
    private JLabel labelAge = new JLabel("Wiek");

    private JLabel jLabel = new JLabel("Podgląd");

    private DefaultListModel defaultListModel;
    private JList list;

    public Frame(){
        super (new BorderLayout());

        defaultListModel = new DefaultListModel();
        list = new JList(defaultListModel);
        JScrollPane jScrollPane = new JScrollPane(list);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setSelectedIndex(0);
        list.setVisibleRowCount(5);

        AddListener addListener = new AddListener();
        buttonAdd.addActionListener(addListener);

        RemoveListener removeListener = new RemoveListener();
        buttonRmv.addActionListener(removeListener);

        JPanel labelsAndTextFieldsName = new JPanel();
        labelsAndTextFieldsName.setLayout(new BoxLayout(labelsAndTextFieldsName,BoxLayout.X_AXIS));
        labelsAndTextFieldsName.add(labelName);
        labelsAndTextFieldsName.add(txtName);

        JPanel labelsAndTextFieldsSurname = new JPanel();
        labelsAndTextFieldsSurname.setLayout(new BoxLayout(labelsAndTextFieldsSurname,BoxLayout.X_AXIS));
        labelsAndTextFieldsSurname.add(labelSurname);
        labelsAndTextFieldsSurname.add(txtSurname);

        JPanel labelsAndTextFieldsAge = new JPanel();
        labelsAndTextFieldsAge.setLayout(new BoxLayout(labelsAndTextFieldsAge,BoxLayout.X_AXIS));
        labelsAndTextFieldsAge.add(labelAge);
        labelsAndTextFieldsAge.add(txtAge);

        JPanel textFields = new JPanel();
        textFields.setLayout(new BoxLayout(textFields,BoxLayout.Y_AXIS));
        textFields.add(labelsAndTextFieldsName);
        textFields.add(labelsAndTextFieldsSurname);
        textFields.add(labelsAndTextFieldsAge);

        JPanel buttons = new JPanel();
        buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
        buttons.add(buttonAdd);
        buttons.add(buttonRmv);

        JPanel buttonsAndTextFields = new JPanel();
        buttonsAndTextFields.setLayout(new BoxLayout(buttonsAndTextFields,BoxLayout.Y_AXIS));
        buttonsAndTextFields.add(textFields);
        buttonsAndTextFields.add(buttons);

        add(jScrollPane, BorderLayout.CENTER);
        add(buttonsAndTextFields, BorderLayout.LINE_END);
        add(jLabel, BorderLayout.SOUTH);
    }

    private static void initGui() {
        JFrame frame = new JFrame("Baza pracowników");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JComponent newContentPane = new Frame();
        newContentPane.setOpaque(true); 
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                initGui();
            }
        });
    }
}

AddListener:

package package_;

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

/**
 * Created by nmrowka on 23.07.17.
 */

public class AddListener implements ActionListener{
    private String name;
    private String surname;
    private int age;

    @Override
    public void actionPerformed(ActionEvent e) {
        setParameters();
        Person person = new Person(name,surname,age);
    }

    private void setParameters(){
        name = txtName.getText();
        surname = txtSurname.getText();
        age = Integer.parseInt(txtAge.getText());
    }
}

Poprzez addActionListener, który mam podpięty do buttona buttonAdd, chce sobie tworzyć nowy obiekt "Person". ActionListener mam w osobnej klasie "AddListener". Problem polega na tym, że sam listener działa (jak sobie tam wrzucę polecenie tworzenia obiektu to mam w konsoli wypisane, że obiekt powstaje), ale nie wiem jak się dobrać to pól tekstowych txtName, txtSurname i txtAge. Kiedy korzystam z metody txtName.getText() mam błąd - "Cannot resolve symbol txtName".
Dalej obiekt ma być dodawany do listy, a jak się klinie w daną pozycję na liście, to w JLabel będzą wypisane szczegółowe dane.
Jak dobrać się do tych pól?

0

Przecież klasa AddListener nie wie nic o zmiennych txtName i txtSurname.... (dlatego dostajesz "Cannot resolve symbol txtName"). Stwórz sobie konstruktor w AddListener, który będzie przyjmować dwie zmienne i w momencie tworzenia obiektu AddListener w klasie Frame, przekażesz zmienne txtName i txtSurname.

0

tak też kombinowałem z konstruktorem

AddListener addListener = new AddListener(txtName.getText(),txtSurname.getText(),12); //ostatni parametr przykładowy
public AddListener(String name,String surname, int age){
        this.name = name;
        this.surname = surname;
        this.age = age;
    }

tylko że nie przekazuje żadnych danych - jedyne co dostaje to ostatni parametr, który sobie na sztywno dla testów wpisałem

0

W momencie kiedy tworzysz obiekt AddListener i podpinasz go jako event, przekazujesz mu poprzez konstruktor wartości JTextField w tej chwili te wartości są puste, ponieważ pola w widoku nie są wypełnione. I nawet jeśli później wpiszesz coś do pola tekstowego i wyzwolisz listenera to nadal dostaniesz puste wartości ponieważ AddListener cały czas przechowuje TE SAME WARTOŚCI które mu przekazałeś w konstruktorze. Jeśli chcesz zrobić to co chcesz to do konstruktora musisz przekazać referencję do obiektu JTextField i w metodzie actionPerformed pobrać wartści txtName.getText().

0

Ok, rozumiem. Teraz działa jak należy, dziękuje bardzo! :) tym bardziej, że chyba specjalnie założyłeś konto, żeby odpowiedzieć :D

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