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