• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JButton, JLabel, JTextField dodawane przez metody, wartość null po wyjściu z metody...

Object Storage Arubacloud
0 głosów
809 wizyt
pytanie zadane 14 marca 2016 w Java przez mkl215 Początkujący (280 p.)

Cześć wszystkim. Mam problem :)

Zaczynam przerabiać swoje programy by były bardziej czytelne, powtarzający się kod programu wrzucam w metody, tworzę klasy wewnętrzne etc. Dodam, że wyświetlenie GUI za pomocą tego programu jest poprawne.

Zamieszczam pytanie po nieudanych próbach znalezienia odpowiedzi w googlach.. Proszę o wyrozumiałość :)

Poniżej zamieszczam kod klasy odpowiedzialnej za GUI i akcje z nim związane:


import javafx.scene.paint.Color;

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

public class BmiFrame extends JFrame
{
    private static final int DEFAULT_WIDTH = 350;
    private static final int DEFAULT_HEIGTH = 270;
    private JPanel buttonPanel;

    private JLabel lInfo, lWzrost, lWaga, lTwojeBMI, lBMI, lKomentarz1, lKomentarz2;
    private JButton bCount, bClose;
    private JTextField tWzrost, tWaga;

    public BmiFrame()
    {
        setLayout(null);
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGTH);
        setTitle("Licznik BMI");

        buttonPanel = new JPanel();
        buttonPanel.setSize(DEFAULT_WIDTH, DEFAULT_HEIGTH);
        buttonPanel.setLayout(null);

        addLabel("Do obliczenia BMI wprowadź swój wzrost i wagę.", lInfo, 15, 15, 300, 20);
        addLabel("Wzrost:", lWzrost, 30, 50, 70, 20);
        addLabel("Waga:", lWaga, 155, 50, 70, 20);
        // SCREEN NR 2
        addLabel("Twoje BMI:", lTwojeBMI, 15, 140, 100, 20);
        addLabel("Wprowadź wzrost i wagę", lBMI, 90, 140, 200, 20);
        addLabel("Komentarz:", lKomentarz1, 15, 160, 100, 20);
        addLabel("Komentarz(2):", lKomentarz2, 90, 160, 250, 20);

        addTextField(tWzrost, 80, 50, 50, 20, "Wzrost podaj w centymetrach");
        addTextField(tWaga, 200, 50, 50, 20, "Wagę podaj w kilogramach");

        addButton("Zamknij", bClose, 210, 190, 100, 20, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                dispose();
            }
        });

        addButton("Oblicz BMI", bCount, 30, 80, 220, 40, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                String name = JOptionPane.showInputDialog("Podaj Nick:");
                // W PONIŻSZYM WIERSZU PROGRAM SIĘ WYWALA
!!! =========>  double waga = Double.parseDouble(tWaga.getText());
                double wzrost = Double.parseDouble(tWzrost.getText());
                double BMI = Metody.obliczBMI(waga, wzrost);

                lBMI.setText("BMI użytkownika: " + name + ": " + String.valueOf(BMI));
                lKomentarz2.setText(Metody.komentarz(BMI));
            }
        });

        add(buttonPanel);
    }

    // SCREEN NR 1
    public void addLabel(String n, JLabel l, int x, int y, int H, int W)
    {
        l = new JLabel(n);
        l.setBounds(x, y, H, W);
        buttonPanel.add(l);
    }

    public void addTextField(JTextField tf, int x, int y, int H, int W, String toolTip)
    {
        tf = new JTextField();
        tf.setBounds(x, y, H, W);
        tf.setToolTipText(toolTip);
        buttonPanel.add(tf);
    }

    public void addButton(String n, JButton b, int x, int y, int H, int W, ActionListener listener)
    {
        b = new JButton(n);
        b.setBounds(x, y, H, W);
        b.addActionListener(listener);
        buttonPanel.add(b);
    }
}

 

Póki nic nie klikniemy jest ok, program się nie wali, nie rzuca wyjątkami, jeśli jednak naciśnięty zostanie przycisk "Oblicz BMI" program rzuca wyjątkiem: java.lang.NullPointerException i wyświetlony jest numer wiersza zaznaczony wyżej w kodzie trzeba wykrzyknikami.

Poniżej zamieszczam dwa screeny z debuggera:

1. wejście do metody z przykładowym lablem -> wszystko wydaje się ok, zmienne są zdefiniowane, jednak...

2. ... po wyjściu z metody dany przycisk ma wartość null ... (patrzcie na wiersz zaznaczony na czerwono, na niebiesko debugger dopiero wchodzi do metody jednak i przed wejściem i po wejściu jest taki sam efekt :/ )

Podejrzewam, że problemem jest nietrwałe wpisanie wartości do przycisku, ale już sam nie wiem...

Podejrzewam, że podobny problem będę miał przy optymalizacji innych programów, więc proszę o pomoc w rozwiązaniu problemu i np. link do jakiegoś artykułu z tym związanego.

Dzięki

1 odpowiedź

+1 głos
odpowiedź 14 marca 2016 przez mbabane Szeryf (79,280 p.)
edycja 14 marca 2016 przez mbabane

to  nie zadziala dlatego ze obiekty przekazywane do metody np. addLabel, nie maja zadnej referencji:

(...) język programowania Java nie używa
wywołań przez referencję dla obiektów. W zamian referencje do obiektów są przekazywane przez wartość.

Zrodlo: Cay S. Horstmann & Gary Cornell  "Java. Podstawy. Wydanie IX"

zeby tak zadzialalo musisz najpierw zrobic np.:
bCount = new JButton();
addButton("Etykieta", bCount, ..., ... )
 ;

a w addButton usunac b = new JButton(n);

komentarz 14 marca 2016 przez mkl215 Początkujący (280 p.)

Dzięki, coś się zmieniło, jednak problem jest dalej w tym samym wierszu.

Zastosowałem to co napisałeś, do wszystkich JLabeli, JButtonów, JTextFieldów.
Poniżej obrazek uruchomionego programu i wprowadzonych przykładowych danych:

Wyjątek zniknął, na jego miejsce pojawił się nowy... W tym samym miejscu :)
java.lang.NumberFormatException: empty String

komentarz 14 marca 2016 przez mbabane Szeryf (79,280 p.)

double waga = new Double( tWaga.getText() ).doubleValue();

komentarz 14 marca 2016 przez mkl215 Początkujący (280 p.)

DZIAŁA !!! Temat do zamknięcia :)

Powodem wyjątku było to co w dałem w komentarz, wszystko wróciło do normy :)
Screen poniżej dla "POTOMNYCH" :)

Dzięki jeszcze raz za pomoc :) POZDRAWIAM !!

komentarz 14 marca 2016 przez mbabane Szeryf (79,280 p.)
a faktycznie zapomnialem napisac ze to nie bedize potrzebne ;)

Podobne pytania

0 głosów
1 odpowiedź 332 wizyt
pytanie zadane 11 stycznia 2020 w Java przez MatiiMann Nowicjusz (150 p.)
+1 głos
5 odpowiedzi 383 wizyt
0 głosów
1 odpowiedź 310 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...