Wypisanie statusu poprawności podanego PESELu

0

Witam
Robię program w swingu, w którym użytkownik między innymi musi podać pesel, chciałbym żeby obok miejsca gdzie wpisuje użytkownik pisało czy jest poprawny, stworzyłem klasę sprawdzającą, lecz nie wiem jak zrobić, żeby wypisywało status, kombinowałem na różne sposoby i nadal nie znalazłem rozwiązania. Zaznaczam, że jestem początkującym programistą. Proszę o pomoc.

1

setText?

0

nie rozumiem jak za pomocą setText mam to zrobić. Część kodu:

public class Dodaj extends JFrame {
String popraw;
 public Dodaj() {
JPanel dman = new JPanel();
JPanel mtek = new JPanel();
JLabel tl3 = new JLabel("PESEL:");
JLabel spr = new JLabel (popraw); 
psl = new JTextField(10);
tf2.add(tl3); tf2.add(psl); tf2.add(spr);
tf2.setLayout(new FlowLayout(FlowLayout.LEFT));
mtek.add(tf2);
JButton zap = new JButton("Zapisz");        
       dman.setLayout(new BorderLayout());
        mtek.setLayout(new BoxLayout(mtek, 3));      
        dman.add(zap, BorderLayout.PAGE_END);
        dman.add(mtek, BorderLayout.CENTER);
 zap.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                zapisz();
            }
        });
       
        setContentPane(dman);
        pack();
        setVisible(true);
}

i klasa sprawdzającą pesel:

public class PeselCheck {

    private byte PESEL[] = new byte[11];
    boolean popraw = false;
    int rok, miesiac, dzien;
    

    public PeselCheck(String psl) {

        try {
            if (psl.length() != 11) {
                popraw = false;
            } else {

                for (int i = 0; i < 11; i++) {
                    PESEL[i] = Byte.parseByte(psl.substring(i, i + 1));
                }

                if (sumKont() && sprMies() && sprDnia()) {
                    popraw = true;
                } else {
                    popraw = false;
                }

            }
        } catch (NullPointerException e) {
            System.out.println("Błąd " + e);
        }
    }

    public int rokUr() {
        rok = 10 * PESEL[0];
        rok += PESEL[1];
        miesiac = 10 * PESEL[2];
        miesiac += PESEL[3];
        if (miesiac > 80 && 93 < miesiac) {
            rok += 1800;
        } else if (miesiac > 0 && 13 > miesiac) {
            rok += 1900;
        } else if (miesiac > 20 && 33 > miesiac) {
            rok += 2000;
        } else if (miesiac > 40 && 53 > miesiac) {
            rok += 2100;
        } else if (miesiac > 60 && 73 > miesiac) {
            rok += 2200;
        }
        return rok;
    }

    public int MiesiacUr() {
        miesiac = 10 * PESEL[2];
        miesiac += PESEL[3];
        if (miesiac > 80 && miesiac < 93) {
            miesiac -= 80;
        } else if (miesiac > 20 && miesiac < 33) {
            miesiac -= 20;
        } else if (miesiac > 40 && miesiac < 53) {
            miesiac -= 40;
        } else if (miesiac > 60 && miesiac < 73) {
            miesiac -= 60;
        }
        return miesiac;
    }

    public int dzienUr() {
        dzien = 10 * PESEL[4];
        dzien += PESEL[5];
        return dzien;
    }

    public String plec() {
        if (popraw) {
            if (PESEL[9] % 2 == 1) {
                return "Mężczyzna";
            } else {
                return "Kobieta";
            }
        } else {
            return "---";
        }
    }

    private boolean sumKont() {
        int sum = 1 * PESEL[0]
                + 3 * PESEL[1]
                + 7 * PESEL[2]
                + 9 * PESEL[3]
                + 1 * PESEL[4]
                + 3 * PESEL[5]
                + 7 * PESEL[6]
                + 9 * PESEL[7]
                + 1 * PESEL[8]
                + 3 * PESEL[9];
        sum %= 10;
        sum = 10 - sum;
        sum %= 10;

        if (sum == PESEL[10]) {
            return true;
        } else {
            return false;
        }
    }

    private boolean sprMies() {
        int miesiace = MiesiacUr();
        if (miesiace > 0 && miesiace < 13) {
            return true;
        } else {
            return false;
        }
    }

    private boolean sprDnia() {
        int roki = rokUr();
        int miesiace = MiesiacUr();
        int dziena = dzienUr();
        if ((dziena > 0 && dziena < 32)
                && (miesiace == 1 || miesiace == 3 || miesiace == 5
                || miesiace == 7 || miesiace == 8 || miesiace == 10
                || miesiace == 12)) {
            return true;
        } else if ((dziena > 0 && dziena < 31)
                && (miesiace == 4 || miesiace == 6 || miesiace == 9
                || miesiace == 11)) {
            return true;
        } else if ((dziena > 0 && dziena < 30 && rokPrzest(roki))
                || (dziena > 0 && dziena < 29 && !rokPrzest(roki))) {
            return true;
        } else {
            return false;
        }
    }

    private boolean rokPrzest(int rok) {
        if (rok % 4 == 0 && rok % 100 != 0 || rok % 400 == 0) {
            return true;
        } else {
            return false;
        }
    }
    
}

0

Tworząc obiekt klasy PeselCheck przekaż referencję do klasy Dodaj,

public class PeselCheck {
 
    private byte PESEL[] = new byte[11];
    boolean popraw = false;
    int rok, miesiac, dzien;
 
 
    public PeselCheck(String psl, Dodaj okno) {
 
        try {
            if (psl.length() != 11) {
                okno.spr.setText("Zła długość - wymagane jest 11 znaków");
            } else {
 
                for (int i = 0; i < 11; i++) {
                    PESEL[i] = Byte.parseByte(psl.substring(i, i + 1));
                }
                //można dużo prościej
                PESEL = psl.getBytes();
 
                if (sumKont() && sprMies() && sprDnia()) {
                    okno.spr.setText("Poprawny Pesel");
                } else {
                    okno.spr.setText("Niepoprawny Pesel");;
                }
 
            }
        } catch (NullPointerException e) {
            System.out.println("Błąd " + e);
        }
    }
0

Nie wiem czemu nie widzi mi, że w okno jest zmienna spr. Już wiem trzeba było wyjąć z konstruktora zmienną, ale teraz nie wiem jak to wywołać, żeby mi nie zawiesiło programu gdy robię to tak:

Dodaj okno = new Dodaj();
       PeselCheck pEsEl = new PeselCheck(pesel, okno);

zawiesza mi się, domyślam się, że to dlatego, że w konstruktorze wywołuję konstruktor i tak w kółko.

0

A w którym miejscu umieściłeś te dwie instrukcje?

0

Próbowałem w konstruktorze oraz tworzyłem metodę, którą wywoływałem w konstruktorze, lecz zwróciłem uwagę, że przecież muszę najpierw sczytać wpisany pesel, w metodzie zapisz jest pesel = psl.getText(); więc i tam wstawiałem i wciąż zawiesza się.

0

Obie instrukcje w metodzie zapisz()? To na pewno jest źle, Ty nie masz tworzyć nowego obiektu klasy Dodaj, tylko przekazać ten, który już istnieje i w którym użytkownik pracuje.
Jak się przejawia zawieszenie programu?

0

zrobiłem trochę inaczej, po pierwsze to PESEL = psl.getBytes(); nie spełnia tego samego co w moim kodzie, jakieś inne liczby pojawiły się w tablicy PESEL, po drugie wróciłem do mojego sposobu tylko usunąłem w klasie PeselCheck przypisanie false do zmiennej popraw następnie w metodzie zapisz wstawiłem

PeselCheck pEsEl = new PeselCheck(pesel);
        if(pEsEl.popraw){
        popraw = "Nr PESEL poprawny";}else{
        popraw = "Nr PESEL niepoprawny";} 
        spr.setText(popraw); 

nie jest to do końca to co chciałem osiągnąć, ale już mi się nie chce kombinować.

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