На панельке есть текстовое поле и lable, из label данные должны передаватся в текстовое поле
На панельке есть текстовое поле и lable, из label данные должны передаваться в текстовое поле, но есть одна строка которая мешает, если ее убрать, то всё будет работать нормально, вот эта строка:
First f = new First(prizvyshe.getText(),imya.getText(),pobatkovi.getText(),misto.getText(),adresa.getText(),telefon.getText(),POL.getText());
Я хочу, чтобы каждый раз когда кнопка нажималась выполнялось действие, прописанное в классе - считывались данные и заполнялись те несколько массивов строк.
Код:
package mainkursova;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.JPanel;
class First {
String[] prizvyche, ima, batka, mist, adres, telefone, poll;
int i = -1;
First(String p, String im, String b, String m, String a, String t, String pol){
i++;
this.prizvyche[i] = p;
this.ima[i] = im;
this.batka[i] = b;
this.mist[i] = m;
this.adres[i] = a;
this.telefone[i] = t;
this.poll[i] = pol;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("Мій Телефонний Довідник");
frame.setSize(300, 200);
frame.setLocation(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
JPanel panel = new JPanel();
frame.add(panel);
JLabel label1 = new JLabel("прізвище");
JLabel label2 = new JLabel("ім’я");
JLabel label3 = new JLabel("по батькові");
JLabel label4 = new JLabel("місто");
JLabel label5 = new JLabel("домашня адреса");
JLabel label6 = new JLabel("стать");
JLabel label = new JLabel("телефон");
JTextField prizvyshe = new JTextField(8);
JTextField imya = new JTextField(8);
JTextField pobatkovi = new JTextField(8);
JTextField misto = new JTextField(8);
JTextField adresa = new JTextField(8);
JTextField telefon = new JTextField(8);
JTextField POL = new JTextField(8);
TextArea text = new TextArea();
panel.add(prizvyshe);
panel.add(imya);
panel.add(pobatkovi);
panel.add(misto);
panel.add(adresa);
panel.add(text);
panel.add(POL);
panel.add(telefon);
JButton mainprofesor = new JButton("добавити в довідник");
panel.add(mainprofesor);
mainprofesor.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
First f = new First(prizvyshe.getText(),imya.getText(),pobatkovi.getText(),misto.getText(),adresa.getText(),telefon.getText(),POL.getText());
String h = text.getText();
text.setText(h+'\n'+prizvyshe.getText()+" "+imya.getText()+" "+pobatkovi.getText()+" "+misto.getText()+" "+adresa.getText()+" "+telefon.getText()+" "+POL.getText()+'\n');
prizvyshe.setText("");
imya.setText("");
pobatkovi.setText("");
misto.setText("");
adresa.setText("");
telefon.setText("");
POL.setText("");
}
});
JMenu serch = new JMenu("Пошук за..");
JMenu serch2 = new JMenu("Пошук за..");
panel.setVisible(true);
}
}
Общее задание: "сделать телефонную книжку", которую можно редактировать, удалять записи, искать по полу, номеру, городу и т.д., другие способы решения приветствуются.
Ответы (2 шт):
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at mainkursova.First.(First.java:16) at
Потому, что не инициализированы переменные, к которым вы обращаетесь из конструктора
String[] prizvyche, ima, batka, mist, adres, telefone, poll;
в конструкторе
prizvyche = new String[100];
ima = new String[100];
...
Размерность массива выбрана условно, то есть не должно быть больше 100 записей.
Потом эти переменные и i нужно сделать static, иначе вы не сможете поменять значение.
Вот здесь в Java Tutorial даётся подробное описание про статические переменные.
Иногда вам нужно иметь переменные, общие для всех объектов. Это достигается с помощью модификатора
static. Поля, в объявлении которых есть модификаторstatic, называются статическими полями или переменными класса. Они связаны с классом, а не с каким-либо объектом. Каждый экземпляр класса разделяет переменную класса, которая находится в одном фиксированном месте в памяти. Любой объект может изменить значение переменной класса, но переменными класса также можно управлять без создания экземпляра класса.
Если бы инициализация переменных была основной проблемой этого кода, то это было бы просто здорово. Попробуйте для начала хотя бы так(лишний код я закоментировал, он у вас ничего не делает и как с ним быть решайте сами):
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class First extends JFrame {
private final List<PhoneBook> phoneBooks;
private JTextField[] textFields;
private TextArea textArea;
public First() {
this.phoneBooks = new ArrayList<>();
initComponents();
}
private void initComponents() {
setTitle("Мій телефонний довідник");
setSize(800, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
JPanel panel = new JPanel();
add(panel);
// JLabel label1 = new JLabel("Прізвище");
// JLabel label2 = new JLabel("Ім’я");
// JLabel label3 = new JLabel("По батькові");
// JLabel label4 = new JLabel("Місто");
// JLabel label5 = new JLabel("Домашня адреса");
// JLabel label6 = new JLabel("Стать");
// JLabel label = new JLabel("Телефон");
textFields = Stream.of(new JTextField(8), new JTextField(8), new JTextField(8), new JTextField(8),
new JTextField(8), new JTextField(8), new JTextField(8))
.peek(panel::add)
.toArray(JTextField[]::new);
textArea = new TextArea();
panel.add(textArea);
JButton addButton = new JButton("добавити в довідник");
panel.add(addButton);
addButton.addActionListener(this::addButtonPressed);
// JMenu serch = new JMenu("Пошук за..");
// JMenu serch2 = new JMenu("Пошук за..");
}
private void addButtonPressed(ActionEvent event) {
phoneBooks.add(new PhoneBook(textFields[0].getText(), textFields[1].getText(), textFields[2].getText(),
textFields[3].getText(), textFields[4].getText(), textFields[5].getText(), textFields[6].getText()));
textArea.setText(phoneBooks.stream().map(pb -> pb.toString()).collect(Collectors.joining("\n")));
for (JTextField textField : textFields) textField.setText("");
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(() -> {
First uf = new First();
uf.setVisible(true);
uf.setLocationRelativeTo(null);
//uf.setResizable(false);
});
}
private static class PhoneBook {
private final String surname, name, patronymic, city, address, phone, sex;
public PhoneBook(String surname, String name, String patronymic, String city, String address, String phone, String sex) {
this.surname = surname;
this.name = name;
this.patronymic = patronymic;
this.city = city;
this.address = address;
this.phone = phone;
this.sex = sex;
}
@Override
public String toString() {
return surname + " " + name + " " + patronymic + ", " + city + ", " + address + ", " + phone + ", " + sex;
}
}
}